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、&>唯一バッシュ4.0とのzshのIIRC最近のバージョンで動作します。よりポータブルなソリューションについては、foo > bar 2&>1。参照:mywiki.wooledge.org/BashFAQ/014
Rein

6
@Rein Henrichs:それは2 && 1ではなく2>&1
camh

私はそれをプログラミングからの肺炎(?)で覚えています: '2'、to( '>')Location( '&')Of '1'
hometoast

1
@hometoast:ニーモニックですか?:)肺炎は肺を意味します
...-carlpett

22

Pythonアプリは、通常のSTDOUTではなくSTDERR出力チャネルに出力を書き込む必要があります。シェル構造を使用する>と、出力チャネルに書き込まれたデータのみをキャッチしてリダイレクトしますが、実際に印刷できるチャネルは他にもいくつかあります。最も一般的なのは、通常エラーに使用される2番目のチャネルです。

次のように、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
カレブ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.