Văd comenzi de genul acesta în unele scripturi: /bin/cat somefile | someprogram
. Aș dori să știu cum să citesc întreaga conductă la fel ca un program. Deci, când rulez /bin/cat something | myprogram.sh
, myprogram.sh are o variabilă numită mypipevar egală cu orice a fost canalizat – tot textul țevii. Dacă acest lucru nu este clar, vă rugăm să ne anunțați. Am citit că citirea probabil nu va funcționa și este posibil ca bash să nu fie shell-ul potrivit.
Răspuns
Conducta se conectează stdout
al unui program la stdin
al altuia, deci în scriptul dvs. citiți pur și simplu din stdin
și veți obține ceea ce a imprimat comanda anterioară. O modalitate simplă de a citi acest lucru într-o variabilă este cu cat, de exemplu în interiorul myprogram.sh
:
mypipevar="$(cat ${1:-/dev/stdin})" echo "Obtained the value: "$mypipevar""
Cu toate acestea, destul de de multe ori doriți să procesați lucrurile rând cu rând mai degrabă decât dintr-o dată, acest lucru se poate face cu
while read line do echo "$line" done < "${1:-/dev/stdin}"
Rețineți că ${1:-/dev/stdin}
vă va oferi primul argument sau, dacă nu sunt specificate argumente, atunci /dev/stdin
care va conține conținutul stdin care poate fi citit ca un fișier. Acest lucru vă permite să executați scriptul fie ca command | script
, fie pur și simplu ca script filename
.