J'ai un script dans lequel les données sont traitées en les diffusant via un pipeline assez important. Plusieurs sections du pipeline sont en fait des fonctions de « standard » qui font différentes choses en fonction de certains paramètres externes. Un exemple artificiel est donné ci-dessous.
#! /bin/bash
switchboard() {
# Select the appropriate command depending on input.
case "$1" in
1)
sort
;;
2)
awk '{ print $5 }' | sort
;;
*)
cat # <= Is there something more optimal here?
;;
esac
}
# The data processing pipeline.
<"$1" tr '[:upper:]' '[:lower:]' | switchboard "$2" | head -n 10
Dans la fonction « standard », la solution de repli consiste simplement à utiliser cat
pour envoyer l'entrée directement à la sortie. Cela fonctionne très bien, mais dans mon pipeline, j'ai peut-être de nombreux "standards" et j'aimerais éviter de créer un tas de cat
qui ne font rien processus si possible.
Existe-t-il une sorte de bash intégré (ou alternatif) pouvant être utilisé pour spécifier qu'une section donnée d'un pipeline doit connecter STDOUT directement à STDIN sans avoir à utiliser de sous-processus? (J'ai essayé :
mais qui a juste mangé les données) Ou, est-ce que cat
utiliser une si petite quantité de ressources que ce n'est pas un problème ?
Réponse acceptée :
Tout d'abord, l'utilisation d'un autre cat
ne fait pas vraiment de différence, et vous ne devriez pas vous en préoccuper.
Deuxièmement, les commandes qui composent un pipeline sont de toute façon exécutées dans des processus séparés, qu'il s'agisse de commandes externes ou intégrées :
$ a=0
$ a=1 | a=2 | a=3
$ echo $a
0
Quant à votre problème exact, il n'est pas possible de connecter simplement "stdin" à "stdout" ; même si un shell avait des nop
intégré qui s'effondrerait lorsqu'il est utilisé dans un pipeline (par exemple | nop |
-> |
), le shell n'a aucun moyen de savoir à l'avance, au moment où il configure le pipeline, que votre « standard » passera en nop
au lieu de awk
ou sort
.
Vous pouvez également obtenir le même effet que vos « tableaux de contrôle » en construisant vous-même le pipeline, puis en appelant eval pour l'exécuter. Exemple :
$ cat test.shtype=`file -zi "$1"`case $type in*application/gzip*) mycat='zcat "$1"';;*) mycat='cat "$1"';;esaccase $type in*charset=utf-16le*) mycat="$mycat | iconv -f utf16le";;esac# surligne les commentaires dans blueesc=`printf '