pengalihan stderr tidak bekerja di csh


11

Saya menjalankan perintah berikut:

pkg_add emacs-23.4,2.tbz 2> output.log

Output masih ditampilkan di terminal. Ketika saya menekan , saya mengerti

pkg_add emacs-23.4,2.tbz 2 > output.log

dengan spasi sebelum2 .

Saya awalnya tidak meletakkan ini. saya coba

pkg_add emacs-23.4,2.tbz > output.log 2>&1

Sekali lagi, ketika saya menekan , spasi telah ditambahkan .

Kenapa ini terjadi padaku?

Saya menjalankan csh di FreeBSD.

Jawaban:


12

Pengalihan 2> tidak berfungsi dengan csh atau tcsh.

Gunakan chshperintah untuk mengubah shell Anda ke / bin / sh atau / usr / local / bin / bash untuk menggunakan 2>pengalihan gaya. Catatan: Jangan ubah shell root ke / usr / local / bin / bash

csh dan tcsh tidak dapat mengalihkan standar dan kesalahan secara terpisah, tetapi >&akan mengarahkan output gabungan ke file.


+1 dan ✔. Saya mengganti cangkang menggunakan sh.
gadgetmo

1
@Craig Dia menjalankan pkg_addFreeBSD, jadi saya berasumsi ini untuk pengguna root (/ bin / csh adalah default untuk root pada FreeBSD). Dalam hal ini Anda tidak harus mengganti shell ke / usr / local / bin / bash. / bin / sh dapat diterima. Anda juga bisa langsung beralih ke shell lain setelah masuk sebagai root.
James O'Gorman

@ JamesO'Gorman Bagus tangkapan saya memperbarui jawaban saya.
Craig

20

Saya tidak yakin apakah Anda mencoba menyembunyikan STDERR atau mengalihkannya ke STDOUT.

Untuk mengalihkan STDOUT ke file:

pkg_add emacs-23.4,2.tbz > stdout.log

Untuk mengalihkan STDOUT dan STDERR ke file:

pkg_add emacs-23.4,2.tbz > & stdxxx.log

Untuk mengalihkan STDOUT ke file dan menyembunyikan STDERR:

( pkg_add emacs-23.4,2.tbz > stdout.log ) > & /dev/null

Untuk mengarahkan kembali STDOUT ke konsol dan menyembunyikan STDERR:

( pkg_add emacs-23.4,2.tbz > /dev/tty ) > & /dev/null

Untuk mengarahkan STDOUT ke konsol dan STDERR ke file:

( pkg_add emacs-23.4,2.tbz > /dev/tty ) > & stderr.log

Untuk mengalihkan STDOUT ke file dan STDERR ke file:

( pkg_add emacs-23.4,2.tbz > stdout.log ) > & stderr.log

EDIT: Alasan mengapa ini berhasil adalah bahwa tindakan dalam () terjadi lebih dulu; Ergo, jika kami telah mengarahkan kembali STDOUT, maka itu tidak akan lagi tersedia di luar (). Ini meninggalkan kita hanya dengan STDERR, dan kemudian kita dapat mengarahkannya seperti yang diinginkan.


Hai @nikc, selamat datang di unix.SE. Komentar Anda bermanfaat dan informatif. Saya sarankan untuk mengedit jawaban Anda dan memasukkannya di sana sehingga tidak mudah terlewatkan.
drs

1

Saya tahu bagaimana melakukannya di Csh, tetapi menggunakan 2 cangkang:

csh -c 'SOME_COMMAND 1>/dev/null' |& tee file.txt

Cara seperti itu memungkinkan untuk mengarahkan ulang hanya stderr ke file.txt, tanpa stdout - yaitu yang Anda inginkan.

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.