GNU/Linux >> Linux Esercitazione >  >> Linux

Come posso inviare un comando a un file, senza ottenere un file vuoto per errore?

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

Linux
  1. Come salvare l'output dei comandi in un file in Linux

  2. Lavorare con l'output di input e il reindirizzamento degli errori in Linux

  3. Come posso collegare simbolicamente un file in Linux?

  4. Come aggiungere l'output a un file?

  5. Come acquisire l'output di un comando top in un file in Linux?

Come salvare l'output dei comandi di Linux in un'immagine o in un file di testo

Come reindirizzare l'output del comando della shell

Come modificare il colore di output di "Echo" in Linux

Come usare il comando echo senza Newline

Esempi di comandi echo Linux

Come fare eco in un file