Qu'est-ce qui pourrait faire échouer silencieusement `>` sous Linux?

20

J'ai exécuté cette commande:

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

Pour vider les données dans le partyapp_dump.jsonfichier. Mais toutes les données sont simplement imprimées à l'écran et un partyapp_dump.jsonfichier vide est créé.

Pourquoi cela pourrait-il arriver? J'ai testé ls > partyapp_dump.jsonet cela a parfaitement fonctionné.

Ram Rachum
la source

Réponses:

40

Avec > vous redirigez uniquement la sortie standard. Essayez 2> à la place pour rediriger la sortie d'erreur. Utilisez &> pour rediriger les deux.

fab
la source
1
Pour info, &>ne fonctionnera que dans Bash 4.0 et iirc versions récentes de zsh. Pour une solution plus portable, foo > bar 2&>1. Référence: mywiki.wooledge.org/BashFAQ/014
Rein Henrichs
6
@Rein Henrichs: C'est 2> & 1, pas 2 &> 1
camh
Je m'en souviens avec un pneumatique (?) De la programmation: '2', à ('>') l'emplacement ('&') de '1'
hometoast
1
@hometoast: Vous voulez dire mnémonique? :) Pneumonique signifie poumon ...
carlpett
22

Votre application python doit écrire sa sortie sur le canal de sortie STDERR au lieu du STDOUT normal. L'utilisation de la construction shell >n'attrape et ne redirige que les données écrites sur le canal de sortie, mais il existe en fait plusieurs autres canaux qui peuvent être imprimés, le plus courant étant le second, généralement utilisé pour les erreurs.

Vous pouvez essayer de piéger STDERR (2ème canal) ainsi:

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

La 2>&1construction connecte le flux de sortie pour les erreurs au canal de sortie normal. Il est inhabituel qu'un programme génère une sortie que vous souhaitez capturer sur le canal d'erreur; généralement, ces informations sont réservées aux informations de débogage et non aux données d'application. Veuillez utiliser ce script avec une certaine prudence car il se comporte de manière non standard.

Vous pouvez également vider les canaux de sortie et d'erreur dans différents fichiers comme celui-ci:

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

En plus de l'explication de sortie stderr vs stdout déjà suggérée, votre application peut simplement ignorer ces deux flux et ouvrir explicitement "/ dev / tty" pour sa sortie.

jlliagre
la source
1

Si l' noclobberoption bash est définie, la redirection échouera (mais pas en silence) si le fichier de destination existe déjà.

Pour une meilleure portabilité, utilisez cmd >| filepour forcer l'écrasement de tout fichier existant.

tylerl
la source
0

Si vous êtes perdu, vous pouvez toujours essayer de l'exécuter avec strace pour voir ce que font les processus:

strace -f command
bluszcz
la source
1
Vraie réponse, mais pas particulièrement pertinente. Si le gars ne s'occupait pas maintenant de la gestion du flux d'erreurs, je ne pense pas qu'il va savoir quoi faire avec la sortie d'un strace.
Caleb