Что может заставить `>` молча потерпеть неудачу в Linux?

20

Я выполнил эту команду:

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

Для сброса данных в partyapp_dump.jsonфайл. Но все данные просто выводятся на экран, и создается пустой partyapp_dump.jsonфайл.

Почему это могло случиться? Я проверил, ls > partyapp_dump.jsonи это сработало отлично.

Рам Рахум
источник

Ответы:

40

С > вы перенаправляете только стандартный вывод. Попробуйте вместо 2> перенаправить вывод ошибки. Используйте &>, чтобы перенаправить оба.

потрясающий
источник
1
К вашему сведению, &>будет работать только в Bash 4.0 и iirc последних версиях Zsh. Для более портативного решения foo > bar 2&>1. Ссылка: mywiki.wooledge.org/BashFAQ/014
Рейн Хенрикс
6
@ Rein Henrichs: это 2> & 1, а не 2 &> 1
camh
Я помню это с легким (?) Из программирования: '2', чтобы ('>') Расположение ('&') из '1'
hometoast
1
@hometoast: Вы имеете в виду мнемонику? :) Пневмония означает легкое ...
Карлпетт
22

Ваше приложение на Python должно записывать свои выходные данные в выходной канал STDERR вместо обычного STDOUT. Использование конструкции оболочки >только перехватывает и перенаправляет данные, записанные в выходной канал, но на самом деле существует несколько других каналов, которые могут быть напечатаны, наиболее распространенным из которых является второй, обычно используемый для ошибок.

Вы также можете попробовать отловить STDERR (2-й канал):

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

2>&1Конструкция соединяет выходной поток на наличие ошибок в нормальный выходной канал. Для программы необычно генерировать вывод, который вы хотели бы захватить на канале ошибки; обычно это зарезервировано для отладочной информации, а не для данных приложения. Пожалуйста, используйте этот скрипт с некоторой осторожностью, поскольку он ведет себя нестандартным образом.

Вы также можете вывести каналы вывода и ошибок в разные файлы, например так:

python ./manage.py dumpdata partyapp.InvitationTemplate > partyapp_dump.json 2> error_output.txt
Калеб
источник
5

В дополнение к уже предложенному объяснению вывода stderr и stdout ваше приложение может просто игнорировать оба этих потока и явно открыть "/ dev / tty" для его вывода.

jlliagre
источник
1

Если установлена noclobberопция bash, перенаправление> не будет выполнено (хотя и не тихо), если целевой файл уже существует.

Для лучшей переносимости используйте cmd >| fileдля принудительной перезаписи любого существующего файла.

tylerl
источник
0

Если вы потерялись, вы всегда можете запустить его с помощью strace, чтобы увидеть, что делают процессы:

strace -f command
bluszcz
источник
1
Верный ответ, но не особо актуален. Если парень сейчас не занимается управлением потоком ошибок, я не думаю, что он узнает, что делать с выводом strace.
Калеб