Vytvořil jsem linku ve skriptu bash a chci zkontrolovat, zda roura obsahuje data, než je předám programu.
Při hledání jsem našel o test -t 0
ale tady to nejde. Vždy vrací false.
Jak se tedy ujistit, že roura má data?
Příklad:
echo "string" | [ -t 0 ] && echo "empty" || echo "fill"
Výstup:fill
echo "string" | tail -n+2 | [ -t 0 ] && echo "empty" || echo "fill"
Výstup:fill
Na rozdíl od standardního/kanonického způsobu testování, zda předchozí potrubí produkovalo výstup? vstup musí být zachován, aby byl předán programu. To zobecňuje Jak převést výstup z jednoho procesu do druhého, ale spustit pouze v případě, že první má výstup? který se zaměřuje na odesílání e-mailů.
Přijatá odpověď:
Neexistuje způsob, jak nahlédnout do obsahu roury pomocí běžně dostupných obslužných programů shellu, ani neexistuje způsob, jak přečíst znak z roury a pak ji vrátit zpět. Jediný způsob, jak zjistit, že roura má data, je přečíst bajt a pak jej musíte dostat do cíle.
Takže udělejte jen to:přečtěte si jeden bajt; pokud zjistíte konec souboru, udělejte to, co chcete, když je vstup prázdný; pokud přečtete bajt, pak rozvětvete, co chcete udělat, když vstup není prázdný, přeneste tento bajt do něj a zbylá data.
first_byte=$(dd bs=1 count=1 2>/dev/null | od -t o1 -A n | tr -dc 0-9)
if [ -z "$first_byte" ]; then
# stuff to do if the input is empty
else
{
printf "\$first_byte"
cat
} | {
# stuff to do if the input is not empty
}
fi
ifne
utilita z moreutils Joeyho Hesse spustí příkaz, pokud jeho vstup není prázdný. Obvykle se neinstaluje ve výchozím nastavení, ale měl by být dostupný nebo snadno sestavit na většině unixových variant. Pokud je vstup prázdný, ifne
neudělá nic a vrátí stav 0, který nelze odlišit od úspěšně spuštěného příkazu. Pokud chcete něco udělat, pokud je vstup prázdný, musíte zařídit, aby příkaz nevracel 0, což lze provést tak, že případ úspěchu vrátí rozlišitelný chybový stav:
ifne sh -c 'do_stuff_with_input && exit 255'
case $? in
0) echo empty;;
255) echo success;;
*) echo failure;;
esac
test -t 0
nemá s tím nic společného; testuje, zda standardní vstup je terminál. Neříká nic o tom, zda je k dispozici nějaký vstup.