Puoi eliminare il file dopo l'esecuzione, se il comando fallisce, con
myAPICommand parameters > myFile.txt || rm myFile.txt
Ma suggerirei invece di cancellare il file:
myAPICommand parameters >| myFile.txt
Vedi Quali sono gli operatori di controllo e reindirizzamento della shell? per i dettagli.
Devi avere impostato "noclobber", controlla il seguente esempio:
$ 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" serve solo per sovrascrivere, puoi comunque aggiungere:
$ echo 4 > 1
bash: 1: cannot overwrite existing file
$ echo 4 >> 1
Per controllare se hai impostato quel flag puoi digitare echo $-
e vedi se hai C
flag impostato (o set -o |grep clobber
).
D:Come posso evitare di scrivere un file vuoto quando il mio comando di base fallisce?
Eventuali requisiti? Potresti semplicemente memorizzare l'output in una variabile e quindi controllare se è vuoto. Controlla il seguente esempio (nota che il modo in cui controlli la variabile deve essere adattato alle tue esigenze, nell'esempio non l'ho citato o usato qualcosa come ${cmd_output+x}
che controlla se la variabile è impostata, per evitare di scrivere un file contenente solo spazi bianchi.
$ 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
Esempio senza utilizzare una singola variabile contenente l'intero output:
log() { while read data; do echo "$data" >> myFile.txt; done; }
myAPICommand.exe parameters |log
È possibile creare uno script per eseguire myAPICommand.exe, ma prima rimuovere myFile.txt se esiste. Quindi non devi eseguire costantemente il comando rm per ripulire.
Tipo:
if [ -e myFile.txt ]
then
rm myFile.txt && myAPICommand.exe
else
Potresti anche fare in modo che il tuo comando si pulisca dopo se stesso. Se il file è vuoto, aggiungi qualcosa come il seguente.
Tipo:
if [ -s myFile.txt ]
then
EXIT 0
else
rm myFile.txt && EXIT 1
fi