Jag ser sådana kommandon i vissa skript: /bin/cat somefile | someprogram
. Jag skulle vilja veta hur man läser hela röret på samma sätt som ett program gör. Så när jag kör /bin/cat something | myprogram.sh
har myprogram.sh en variabel som heter mypipevar lika med vad som helst som pipades – hela rörtexten. Vänligen meddela mig om detta är oklart. Jag har läst att läsning sannolikt inte kommer att fungera, och bash kanske inte är rätt skal.
Svar
Röret ansluter stdout
av ett program till stdin
av ett annat, så läs i ditt skript helt enkelt från stdin
och du får det som föregående kommando skrivs ut. Ett enkelt sätt att läsa in detta i en variabel är med cat till exempel inuti myprogram.sh
:
mypipevar="$(cat ${1:-/dev/stdin})" echo "Obtained the value: "$mypipevar""
Men ganska ofta vill du bearbeta saker rad för rad snarare än allt på en gång, detta kan göras med
while read line do echo "$line" done < "${1:-/dev/stdin}"
Observera att ${1:-/dev/stdin}
ger dig det första argumentet, eller om inga argument anges, så /dev/stdin
som innehåller innehållet i stdin som kan läsas som en fil. Detta låter dig köra skriptet antingen som command | script
eller helt enkelt som script filename
.