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