Cosa potrebbe far fallire silenziosamente `>` in Linux?


20

Ho eseguito questo comando:

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

Per scaricare i dati nel partyapp_dump.jsonfile. Ma tutti i dati vengono appena stampati sullo schermo e partyapp_dump.jsonviene creato un file vuoto .

Perché potrebbe succedere? Ho provato ls > partyapp_dump.jsone ha funzionato perfettamente.

Risposte:


40

Con > reindirizzi solo l'output standard. Prova invece 2> a reindirizzare l'output dell'errore. Usa &> per reindirizzare entrambi.


1
Cordiali saluti, &>funzionerà solo in Bash 4.0 e iirc versioni recenti di zsh. Per una soluzione più portatile, foo > bar 2&>1. Riferimento: mywiki.wooledge.org/BashFAQ/014
Rein Henrichs

6
@Rein Henrichs: Questo è 2> & 1, non 2 &> 1
camh

Lo ricordo con un polmonare (?) Dalla programmazione: '2', a ('>') la posizione ('&') di '1'
hometoast

1
@hometoast: vuoi dire mnemonico? :) Polmonare significa polmone ...
Carlpett,

22

L'app Python deve scrivere l'output sul canale di output STDERR anziché sul normale STDOUT. L'uso del costrutto shell >cattura e reindirizza solo i dati scritti sul canale di output, ma in realtà ci sono molti altri canali su cui è possibile stampare, il più comune dei quali è il secondo, solitamente usato per errori.

Puoi provare a intrappolare STDERR (secondo canale) in questo modo:

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

Il 2>&1costrutto collega il flusso di output per errori al normale canale di output. È insolito che un programma generi output che vorresti catturare sul canale di errore; di solito questo sarebbe riservato per le informazioni di debug e non per i dati dell'applicazione. Si prega di utilizzare questo script con una certa cautela poiché si comporta in modo non standard.

È inoltre possibile scaricare i canali di output e di errore su file diversi come questo:

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

5

Oltre alla spiegazione dell'output stderr vs stdout già suggerita, l'applicazione potrebbe semplicemente ignorare entrambi questi flussi e aprire esplicitamente "/ dev / tty" per il suo output.


1

Se l' noclobberopzione bash è impostata, il reindirizzamento> fallirà (anche se non in silenzio) se il file di destinazione esiste già.

Per una migliore portabilità, utilizzare cmd >| fileper forzare la sovrascrittura di qualsiasi file esistente.


0

Se ti perdi puoi sempre provare a eseguirlo con strace per vedere quali processi stanno facendo:

strace -f command

1
Risposta vera, ma non particolarmente rilevante. Se il ragazzo non avesse ora a che fare con la gestione del flusso di errori, non penso che saprà cosa fare con l'output di un strace.
Caleb,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.