Jeg ser kommandoer som dette i nogle scripts: /bin/cat somefile | someprogram
. Jeg vil gerne vide, hvordan man læser hele røret på samme måde som et program gør. Så når jeg kører /bin/cat something | myprogram.sh
, har myprogram.sh en variabel kaldet mypipevar svarende til hvad der blev pipet – hele rørteksten. Hvis det er uklart, så lad mig det vide. Jeg har læst, at læsning sandsynligvis ikke fungerer, og bash er muligvis ikke den rigtige skal.
Svar
Røret forbinder stdout
i et program til stdin
af et andet, så i dit script skal du blot læse fra stdin
og du får, hvad den forrige kommando blev udskrevet. En enkel måde at læse dette på i en variabel er med kat for eksempel inde i myprogram.sh
:
mypipevar="$(cat ${1:-/dev/stdin})" echo "Obtained the value: "$mypipevar""
Dog ganske ofte vil du behandle tingene linje for linje snarere end alt sammen på én gang, dette kan gøres med
while read line do echo "$line" done < "${1:-/dev/stdin}"
Bemærk at ${1:-/dev/stdin}
giver dig det første argument, eller hvis der ikke er angivet nogen argumenter, så /dev/stdin
, der indeholder indholdet af stdin, som kan læses som en fil. Dette giver dig mulighed for at udføre scriptet som enten command | script
eller ganske enkelt som script filename
.