GNU/Linux >> Znalost Linux >  >> Linux

Jak zkontrolovat, zda je potrubí prázdné, a spustit příkaz na datech, pokud není?

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.

Související:způsob, jak sloučit obrázek .pdf z příkazového řádku?
Linux
  1. Jak napsat a spustit svůj první Qt program v Debianu 10

  2. Jak dosáhnout toho, aby se pro konkrétní proces spustil pouze uživatel, pid a příkaz? (Ubuntu 11.10)

  3. Jak zkontrolovat OS a verzi pomocí příkazu Linux

  1. Jak vytvořit alias a používat příkaz Alias ​​v Linuxu

  2. Jak zkontrolovat verzi OS a Linuxu

  3. Jak nainstalovat a používat příkaz Ping v Linuxu

  1. Jak přejdu pomocí kanálu na příkaz rozdělení Linuxu?

  2. Jak fungují volby '-s', '-t' a '-c' příkazu tr v Unixu?

  3. Jak spustit příkaz Vim z shellu?