Apa yang bisa membuat `>` gagal secara diam-diam di Linux?


20

Saya menjalankan perintah ini:

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

Untuk membuang data ke dalam partyapp_dump.jsonfile. Tetapi semua data baru saja dicetak pada layar dan partyapp_dump.jsonfile kosong dibuat.

Mengapa ini bisa terjadi? Saya diuji ls > partyapp_dump.jsondan itu bekerja dengan sempurna.

Jawaban:


40

Dengan > Anda hanya mengarahkan output standar. Coba 2> sebagai gantinya untuk mengarahkan output kesalahan. Gunakan &> untuk mengarahkan keduanya.


1
FYI, &>hanya akan bekerja di Bash 4.0 dan iirc versi terbaru dari zsh. Untuk solusi yang lebih portabel foo > bar 2&>1,. Referensi: mywiki.wooledge.org/BashFAQ/014
Rein Henrichs

6
@Rein Henrichs: Itu 2> & 1, bukan 2 &> 1
camh

Saya ingat itu dengan pneumonic (?) Dari pemrograman: '2', ke ('>') Lokasi ('&') Dari '1'
hometoast

1
@hometoast: Maksud Anda mnemonik? :) Pneumonic artinya paru-paru ...
carlpett

22

Aplikasi python Anda harus menulis outputnya ke saluran output STDERR alih-alih STDOUT normal. Menggunakan shell konstruksi >hanya menangkap dan mengalihkan data yang ditulis ke saluran output, tetapi sebenarnya ada beberapa saluran lain yang dapat dicetak, yang paling umum adalah yang kedua, biasanya digunakan untuk kesalahan.

Anda dapat mencoba menjebak STDERR (saluran ke-2) juga seperti ini:

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

The 2>&1konstruk menghubungkan output stream untuk kesalahan ke saluran output normal. Merupakan hal yang tidak biasa bagi suatu program untuk menghasilkan keluaran yang ingin Anda tangkap pada saluran kesalahan; biasanya itu akan dicadangkan untuk informasi debug bukan data aplikasi. Silakan gunakan skrip ini dengan hati-hati karena berperilaku dengan cara yang tidak standar.

Anda juga dapat membuang saluran keluaran dan galat ke berbagai file seperti ini:

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

5

Selain penjelasan keluaran stderr vs stdout yang sudah disarankan, aplikasi Anda mungkin mengabaikan kedua aliran ini dan secara eksplisit membuka "/ dev / tty" untuk hasilnya.


1

Jika noclobberopsi bash diatur,>> redirection akan gagal (walaupun tidak diam-diam) jika file tujuan sudah ada.

Untuk portabilitas yang lebih baik, gunakan cmd >| fileuntuk memaksa menimpa file yang ada.


0

Jika Anda tersesat, Anda selalu dapat mencoba menjalankannya dengan strace untuk melihat proses apa yang sedang dilakukan:

strace -f command

1
Jawaban yang benar, tetapi tidak terlalu relevan. Jika orang itu tidak sekarang mengelola aliran kesalahan saya tidak berpikir dia akan tahu apa yang harus dilakukan dengan output dari suatu strace.
Caleb
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.