Ik zie commandos als deze in sommige scripts: /bin/cat somefile | someprogram
. Ik zou graag willen weten hoe ik de hele pijp op dezelfde manier moet lezen als een programma. Dus als ik /bin/cat something | myprogram.sh
draai, heeft myprogram.sh een variabele met de naam mypipevar die gelijk is aan datgene wat werd doorgesluisd – alle pijptekst. Laat het me weten als dit onduidelijk is. Ik heb gelezen dat read waarschijnlijk niet zal werken, en bash is misschien niet de juiste shell.
Answer
De pijp verbindt stdout
van het ene programma naar stdin
van een ander, dus lees in uw script gewoon van stdin
en u krijgt wat het vorige commando heeft uitgeprint. Een eenvoudige manier om dit in een variabele in te lezen is met cat bijvoorbeeld in myprogram.sh
:
mypipevar="$(cat ${1:-/dev/stdin})" echo "Obtained the value: "$mypipevar""
vaak wil je dingen regel voor regel verwerken in plaats van allemaal tegelijk, dit kan gedaan worden met
while read line do echo "$line" done < "${1:-/dev/stdin}"
Merk op dat ${1:-/dev/stdin}
geeft je het eerste argument, of als er geen argumenten zijn gespecificeerd dan /dev/stdin
die de inhoud van stdin zal bevatten die kan worden gelezen als een bestand. Hierdoor kunt u het script uitvoeren als command | script
of gewoon als script filename
.