Що може змусити `>` мовчки вийти з ладу в Linux?


20

Я запустив цю команду:

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

Щоб скинути дані у partyapp_dump.jsonфайл. Але всі дані просто надрукуються на екрані і створюється порожній partyapp_dump.jsonфайл.

Чому це могло статися? Я тестував, ls > partyapp_dump.jsonі це працювало чудово.

Відповіді:


40

З > ви переспрямовуєте лише стандартний вихід. Спробуйте 2> замість цього перенаправити вихід помилки. Використовуйте &> для переадресації обох.


1
FYI, &>працюватиме лише в Bash 4.0 та iirc останніх версіях zsh. Для більш портативних рішень, foo > bar 2&>1. Довідка: mywiki.wooledge.org/BashFAQ/014
Рейн Генріхс

6
@Rein Henrichs: Це 2> & 1, а не 2 &> 1
camh

Я пам’ятаю це з пневмоніки (?) Від програмування: '2', до ('>') Розташування ('&') '1'
рідний берест

1
@hometoast: Ви маєте на увазі мнемонічний? :) Пневмоніке означає легені ...
carlpett

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 vs stdout, ваша програма може просто ігнорувати обидва ці потоки та явно відкривати "/ dev / tty" для його виводу.


1

Якщо параметр noclobberbash встановлений, то> перенаправлення не вдасться (хоч і не мовчки), якщо файл призначення вже існує.

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


0

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

strace -f command

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