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.

gadgetmo
sumber

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.

Craig
sumber
+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.

nikc
sumber
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.

Alexander Samoylov
sumber