V některých skriptech vidím takovéto příkazy: /bin/cat somefile | someprogram. Chtěl bych vědět, jak číst celou rouru stejně, jako to dělá nějaký program. Takže když spustím /bin/cat something | myprogram.sh, má myprogram.sh proměnnou nazvanou mypipevar rovnou cokoli, co bylo pipedováno – celý text kanálu. Pokud to není jasné, dejte mi prosím vědět. Přečetl jsem si, že čtení pravděpodobně nebude fungovat a bash nemusí být tím správným shellem.
Odpověď
Spojení potrubí stdout jednoho programu na stdin jiného, takže ve vašem skriptu jednoduše přečtěte z stdin a dostanete to, co vytiskl předchozí příkaz. Jednoduchý způsob, jak to načíst do proměnné, je například cat uvnitř myprogram.sh:
mypipevar="$(cat ${1:-/dev/stdin})" echo "Obtained the value: "$mypipevar""
Nicméně často chcete věci zpracovávat řádek po řádku, nikoli najednou, lze to provést pomocí
while read line do echo "$line" done < "${1:-/dev/stdin}"
Všimněte si, že ${1:-/dev/stdin} vám dá první argument, nebo pokud nejsou zadány žádné argumenty, pak /dev/stdin který bude obsahovat obsah stdin, který lze číst jako soubor. To vám umožní spustit skript buď command | script nebo jednoduše jako script filename.