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
.