Néhány parancsfájlban ilyen parancsokat látok: /bin/cat somefile | someprogram
. Szeretném tudni, hogyan kell a teljes pipát ugyanúgy elolvasni, ahogy a someprogram. Tehát amikor futtatom az /bin/cat something | myprogram.sh
fájlt, a myprogram.sh rendelkezik a mypipevar nevű változóval, amely megegyezik a pipedelel – az egész pip szöveggel. Ha ez nem világos, kérem, tudassa velem. Olvastam, hogy az olvasás valószínűleg nem fog működni, és a bash nem biztos, hogy a megfelelő shell.
Válasz
A cső összekapcsolódik stdout
a másikból stdin
, így a szkriptben egyszerűen olvassa el a következőt: stdin
és megkapja, amit az előző parancs kinyomtatott. Ennek a változóba történő beolvasásának egyszerű módja a cat, például a myprogram.sh
belül:
mypipevar="$(cat ${1:-/dev/stdin})" echo "Obtained the value: "$mypipevar""
Azonban nagyon gyakran a sorokat akarja feldolgozni, nem pedig egyszerre, ezt megteheti
while read line do echo "$line" done < "${1:-/dev/stdin}"
Vegye figyelembe, hogy ${1:-/dev/stdin}
adja meg az első argumentumot, vagy ha nincs megadva argumentum, akkor /dev/stdin
, amely fájlként olvasható stdin tartalmát fogja tartalmazni. Ez lehetővé teszi a szkript végrehajtását vagy command | script
, vagy egyszerűen script filename
.
néven.