Jeg ser kommandoer som dette i noen skript: /bin/cat somefile | someprogram
. Jeg vil gjerne vite hvordan du leser hele røret på samme måte som et program gjør. Så når jeg kjører /bin/cat something | myprogram.sh
, har myprogram.sh en variabel kalt mypipevar som er lik det som ble sendt – hele rørteksten. Gi meg beskjed hvis dette er uklart. Jeg har lest at lesing sannsynligvis ikke vil fungere, og bash er kanskje ikke det riktige skallet.
Svar
Røret kobler til stdout
av ett program til stdin
av et annet, så i skriptet ditt leser du bare fra stdin
og du får det som forrige kommando ble skrevet ut. En enkel måte å lese dette inn i en variabel er med katt, for eksempel inne i myprogram.sh
:
mypipevar="$(cat ${1:-/dev/stdin})" echo "Obtained the value: "$mypipevar""
Imidlertid ganske ofte vil du behandle ting linje for linje i stedet for alt på en gang. Dette kan gjøres med
while read line do echo "$line" done < "${1:-/dev/stdin}"
Merk at ${1:-/dev/stdin}
vil gi deg det første argumentet, eller hvis ingen argumenter er spesifisert, så /dev/stdin
som inneholder innholdet i stdin som kan leses som en fil. Dette lar deg utføre skriptet som command | script
eller bare som script filename
.