¿Qué podría hacer que `>` falle silenciosamente en Linux?

20

Ejecuté este comando:

python ./manage.py dumpdata partyapp.InvitationTemplate > partyapp_dump.json

Para volcar datos en el partyapp_dump.jsonarchivo. Pero todos los datos solo se imprimen en la pantalla y partyapp_dump.jsonse crea un archivo vacío .

¿Por qué pudo pasar esto? Lo probé ls > partyapp_dump.jsony funcionó perfectamente.

Ram Rachum
fuente

Respuestas:

40

Con > solo redirige la salida estándar. Intente 2> en su lugar para redirigir la salida de error. Use &> para redirigir ambos.

fabuloso
fuente
1
Para su información, &>solo funcionará en Bash 4.0 e iirc versiones recientes de zsh. Para una solución más portátil, foo > bar 2&>1. Referencia: mywiki.wooledge.org/BashFAQ/014
Rein Henrichs
66
@Rein Henrichs: Eso es 2> y 1, no 2 y> 1
camh
Lo recuerdo con un neumónico (?) Desde la programación: '2', hasta ('>') la ubicación ('&') de '1'
hometoast
1
@hometoast: ¿Te refieres a nemotécnico? :) Neumónico significa pulmón ...
carlpett
22

Su aplicación Python debe estar escribiendo su salida en el canal de salida STDERR en lugar del STDOUT normal. El uso de la construcción de shell >solo captura y redirige los datos escritos en el canal de salida, pero en realidad hay varios otros canales en los que se puede imprimir, el más común es el segundo, generalmente utilizado para errores.

Puede intentar atrapar STDERR (segundo canal) así:

python ./manage.py dumpdata partyapp.InvitationTemplate > partyapp_dump.json 2>&1

La 2>&1construcción conecta el flujo de salida para errores al canal de salida normal. Es inusual que un programa genere resultados que desee capturar en el canal de error; generalmente eso estaría reservado para la información de depuración, no para los datos de la aplicación. Utilice este script con precaución, ya que se comporta de manera no estándar.

También puede volcar los canales de salida y error en diferentes archivos como este:

python ./manage.py dumpdata partyapp.InvitationTemplate > partyapp_dump.json 2> error_output.txt
Caleb
fuente
5

Además de la explicación de salida stderr vs stdout ya sugerida, su aplicación podría simplemente ignorar ambas secuencias y abrir explícitamente "/ dev / tty" para su salida.

jlliagre
fuente
1

Si se establece la noclobberopción bash, entonces la redirección fallará (aunque no de forma silenciosa) si el archivo de destino ya existe.

Para una mejor portabilidad, use cmd >| filepara forzar la sobrescritura de cualquier archivo existente.

tylerl
fuente
0

Si está perdido, siempre puede intentar ejecutarlo con strace para ver qué procesos están haciendo:

strace -f command
bluszcz
fuente
1
Respuesta verdadera, pero no particularmente relevante. Si el tipo no sabía cómo administrar la secuencia de errores, no creo que sepa qué hacer con la salida de un strace.
Caleb