Vous pouvez supprimer le fichier après l'exécution, si la commande échoue, avec
myAPICommand parameters > myFile.txt || rm myFile.txt
Mais je suggérerais plutôt d'écraser le fichier :
myAPICommand parameters >| myFile.txt
Voir Quels sont les opérateurs de contrôle et de redirection du shell ? pour plus de détails.
Vous devez avoir défini "noclobber", vérifiez l'exemple suivant :
$ 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" sert uniquement à écraser, vous pouvez toujours ajouter :
$ echo 4 > 1
bash: 1: cannot overwrite existing file
$ echo 4 >> 1
Pour vérifier si vous avez défini ce drapeau, vous pouvez taper echo $-
et voyez si vous avez C
drapeau défini (ou set -o |grep clobber
).
Q :Comment puis-je éviter d'écrire un fichier vide lorsque ma commande de base échoue ?
Des exigences ? Vous pouvez simplement stocker la sortie dans une variable, puis vérifier si elle est vide. Vérifiez l'exemple suivant (notez que la façon dont vous vérifiez la variable doit être ajustée avec précision à vos besoins, dans l'exemple je ne l'ai pas cité ou utilisé quoi que ce soit comme ${cmd_output+x}
qui vérifie si la variable est définie, pour éviter d'écrire un fichier contenant uniquement des espaces blancs.
$ 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
Exemple sans utiliser une seule variable contenant toute la sortie :
log() { while read data; do echo "$data" >> myFile.txt; done; }
myAPICommand.exe parameters |log
Vous pouvez créer un script pour exécuter myAPICommand.exe, mais faites-le d'abord supprimer myFile.txt s'il existe. Ainsi, vous n'avez pas besoin d'exécuter constamment la commande rm pour nettoyer.
Comme :
if [ -e myFile.txt ]
then
rm myFile.txt && myAPICommand.exe
else
Vous pouvez également faire en sorte que votre commande se nettoie après elle-même. Si le fichier est vide, ajoutez quelque chose comme ce qui suit.
Comme :
if [ -s myFile.txt ]
then
EXIT 0
else
rm myFile.txt && EXIT 1
fi