Rør, og hvordan du bruker dem i bash

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.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *