GNU/Linux >> Znalost Linux >  >> Linux

Jak mohu vydat příkaz do souboru, aniž bych při chybě dostal prázdný soubor?

Pokud příkaz selže, můžete soubor po spuštění smazat pomocí

myAPICommand parameters > myFile.txt || rm myFile.txt

Ale místo toho bych navrhoval clobování souboru:

myAPICommand parameters >| myFile.txt

Viz Co jsou operátory ovládání a přesměrování prostředí? pro podrobnosti.


Musíte mít nastaveno "noclobber", podívejte se na následující příklad:

$ echo 1 > 1  # create file
$ cat 1
1
$ echo 2 > 1  # overwrite file
$ cat 1
2
$ set -o noclobber
$ echo 3 > 1  # file is now protected from accidental overwrite
bash: 1: cannot overwrite existing file
$ cat 1
2
$ echo 3 >| 1  # temporary allow overwrite
$ cat 1
3
$ echo 4 > 1
bash: 1: cannot overwrite existing file
$ cat 1
3
$ set +o noclobber
$ echo 4 > 1
$ cat 1
4

"noclobber" je pouze pro přepsání, stále však můžete připojit:

$ echo 4 > 1
bash: 1: cannot overwrite existing file
$ echo 4 >> 1

Chcete-li zkontrolovat, zda máte nastaven tento příznak, můžete zadat echo $- a zjistěte, zda máte C sada příznaků (nebo set -o |grep clobber ).

O:Jak se mohu vyhnout zápisu prázdného souboru, když můj základní příkaz selže?

Nějaké požadavky? Můžete jednoduše uložit výstup do proměnné a poté zkontrolovat, zda je prázdná. Zkontrolujte následující příklad (všimněte si, že způsob, jakým kontrolujete proměnnou, je třeba jemně upravit podle vašich potřeb, v příkladu jsem ji necitoval ani nepoužil nic jako ${cmd_output+x} který kontroluje, zda je nastavena proměnná, aby se zabránilo psaní souboru obsahujícího pouze mezery.

$ cmd_output=$(echo)
$ test $cmd_output && echo yes || echo no
no
$ cmd_output=$(echo -e '\n\n\n')
$ test $cmd_output && echo yes || echo no
no
$ cmd_output=$(echo -e ' ')
$ test $cmd_output && echo yes || echo no
no
$ cmd_output=$(echo -e 'something')
$ test $cmd_output && echo yes || echo no
yes

$ cmd_output=$(myAPICommand.exe parameters)
$ test $cmd_output && echo "$cmd_output" > myFile.txt

Příklad bez použití jediné proměnné obsahující celý výstup:

log() { while read data; do echo "$data" >> myFile.txt; done; }
myAPICommand.exe parameters |log

Můžete vytvořit skript pro spuštění myAPICommand.exe, ale nechte jej nejprve odstranit soubor myFile.txt, pokud existuje. Pak nemusíte neustále provádět příkaz rm k čištění.

Jako:

if [ -e myFile.txt ]
then
    rm myFile.txt && myAPICommand.exe
else

Můžete to také udělat tak, že váš příkaz po sobě uklidí. Pokud je soubor prázdný, přidejte něco jako následující.

Jako:

if [ -s myFile.txt ]
then
        EXIT 0
else
        rm myFile.txt && EXIT 1
fi

Linux
  1. Jak zachytit výstup nejvyššího příkazu Unix do souboru v čitelném formátu

  2. Jak mohu zkontrolovat, zda soubor existuje, a provést příkaz, pokud ne?

  3. Jak mohu symbolicky propojit soubor v Linuxu?

  1. Jak připojit výstup do souboru?

  2. Jak zachytit výstup top příkazu do souboru v linuxu?

  3. Jak vytisknout výstup příkazu Linuxu do souboru?

  1. Jak uložit výstup příkazu do souboru v Linuxu

  2. Práce s Input Output a přesměrováním chyb v Linuxu

  3. Jak vyčistit přípony souborů?