Что может заставить `>` молча потерпеть неудачу в 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" для его вывода.


1

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

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


0

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

strace -f command

1
Верный ответ, но не особо актуален. Если парень сейчас не занимается управлением потоком ошибок, я не думаю, что он узнает, что делать с выводом strace.
Калеб
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.