Назад | Перейти на главную страницу

Что могло заставить `>` тихо перестать работать в Linux?

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

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

Чтобы выгружать данные в partyapp_dump.json файл. Но все данные просто выводятся на экран и пустой partyapp_dump.json файл создан.

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

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

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

Вы также можете попробовать захватить STDERR (2-й канал) следующим образом:

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

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

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

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

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

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

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

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

strace -f command