Je vois des commandes comme celle-ci dans certains scripts: /bin/cat somefile | someprogram
. Je voudrais savoir comment lire le tube entier de la même manière quun programme. Ainsi, lorsque jexécute /bin/cat something | myprogram.sh
, myprogram.sh a une variable appelée mypipevar égale à ce qui a été diffusé – tout le texte du tube. Si cela nest pas clair, veuillez me le faire savoir. Jai lu que la lecture ne fonctionnera probablement pas et que bash nest peut-être pas le bon shell.
Réponse
Le tuyau se connecte stdout
dun programme à stdin
dun autre, donc dans votre script, lisez simplement à partir de stdin
et vous obtiendrez ce que la commande précédente a imprimé. Un moyen simple de lire ceci dans une variable est dutiliser cat par exemple à lintérieur myprogram.sh
:
mypipevar="$(cat ${1:-/dev/stdin})" echo "Obtained the value: "$mypipevar""
Cependant, tout à fait souvent vous voulez traiter les choses ligne par ligne plutôt que dun seul coup, cela peut être fait avec
while read line do echo "$line" done < "${1:-/dev/stdin}"
Notez que ${1:-/dev/stdin}
vous donnera le premier argument, ou si aucun argument nest spécifié alors /dev/stdin
qui contiendra le contenu de stdin qui peut être lu comme un fichier. Cela vous permet dexécuter le script en tant que command | script
ou simplement en tant que script filename
.