Rør, og hvordan man bruger dem i bash

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.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *