Rör och hur man använder dem i bash

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.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *