GNU/Linux >> Tutoriels Linux >  >> Linux

Comment puis-je sortir une commande dans un fichier, sans obtenir un fichier vide en cas d'erreur ?

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

Linux
  1. Comment capturer la sortie de la commande supérieure Unix dans un fichier au format lisible

  2. Comment puis-je vérifier qu'un fichier existe et exécuter une commande sinon?

  3. Comment capturer la sortie d'une commande top dans un fichier sous Linux ?

  4. Comment rediriger la sortie de la commande time vers un fichier sous Linux ?

  5. Comment puis-je chown un fichier à un subuid sans sudo

Comment enregistrer la sortie de la commande Linux dans une image ou un fichier texte

Comment rediriger la sortie de la commande shell

Comment changer la couleur de sortie de 'Echo' sous Linux

Comment utiliser la commande echo sans retour à la ligne

Exemples de commandes echo Linux

Comment faire écho dans le fichier