Puede eliminar el archivo después de ejecutarlo, si el comando falla, con
myAPICommand parameters > myFile.txt || rm myFile.txt
Pero sugeriría golpear el archivo en su lugar:
myAPICommand parameters >| myFile.txt
Consulte ¿Cuáles son los operadores de control y redirección del shell? para más detalles.
Debe tener configurado "noclobber", consulte el siguiente ejemplo:
$ 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" es solo para sobrescribir, aunque aún puede agregar:
$ echo 4 > 1
bash: 1: cannot overwrite existing file
$ echo 4 >> 1
Para verificar si tiene ese indicador establecido, puede escribir echo $-
y mira si tienes C
conjunto de banderas (o set -o |grep clobber
).
P:¿Cómo puedo evitar escribir un archivo en blanco cuando falla mi comando base?
¿Algún requisito? Simplemente puede almacenar la salida en una variable y luego verificar si está vacía. Verifique el siguiente ejemplo (tenga en cuenta que la forma en que verifica la variable necesita un ajuste fino a sus necesidades, en el ejemplo no lo cité ni usé nada como ${cmd_output+x}
que verifica si la variable está configurada, para evitar escribir un archivo que solo contenga espacios en blanco.
$ 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
Ejemplo sin usar una sola variable que contenga toda la salida:
log() { while read data; do echo "$data" >> myFile.txt; done; }
myAPICommand.exe parameters |log
Puede crear una secuencia de comandos para ejecutar myAPICommand.exe, pero primero elimine myFile.txt si existe. Entonces no tienes que ejecutar constantemente el comando rm para limpiar.
Me gusta:
if [ -e myFile.txt ]
then
rm myFile.txt && myAPICommand.exe
else
También puede hacer que su comando se limpie después de sí mismo. Si el archivo está vacío agregando algo como lo siguiente.
Me gusta:
if [ -s myFile.txt ]
then
EXIT 0
else
rm myFile.txt && EXIT 1
fi