GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo puedo enviar un comando a un archivo sin obtener un archivo en blanco por error?

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

Linux
  1. Cómo capturar la salida del comando superior de Unix en un archivo en formato legible

  2. ¿Cómo puedo comprobar que existe un archivo y ejecutar un comando si no es así?

  3. ¿Cómo puedo vincular un archivo en Linux?

  4. ¿Cómo agregar la salida a un archivo?

  5. ¿Cómo capturar la salida de un comando superior en un archivo en Linux?

Cómo guardar la salida del comando de Linux en una imagen o un archivo de texto

Cómo redirigir la salida del comando de shell

Cómo cambiar el color de salida de 'Echo' en Linux

Cómo usar el comando echo sin nueva línea

Ejemplos de comandos echo de Linux

Cómo hacer eco en un archivo