stderr yönlendirme csh'de çalışmıyor


11

Aşağıdaki komutu çalıştırıyorum:

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

Çıkış hala terminalde görüntülenir. Ben bastığımda ,

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

önce bir boşluk ile2 .

Aslında bunu ben koymadım. denerim

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

Bastığımda Yine , boşluk bulunmamaktadır .

Bu neden bana oluyor?

FreeBSD'de csh kullanıyorum.

Yanıtlar:


12

2> yönlendirme csh veya tcsh ile çalışmaz.

Stil yönlendirmesini chshkullanmak için kabuğunuzu / bin / sh veya / usr / local / bin / bash olarak değiştirmek için komutu kullanın 2>. Not: Kök kabuğunu / usr / local / bin / bash olarak değiştirmeyin

csh ve tcsh, standart çıkış ve hatayı ayrı ayrı >&yönlendiremez , ancak birleştirilmiş çıktıyı bir dosyaya yeniden yönlendirir.


+1 ve ✔. Kullanarak kabukları değiştirdim sh.
gadgetmo

1
@Craig O pkg_addFreeBSD üzerinde çalışıyor , bu yüzden bu kök kullanıcı için olduğunu varsayalım (/ bin / csh FreeBSD kök için varsayılan). Bu durumda size gereken değil / usr / local / bin / bash kabuk değiştirir. / bin / sh kabul edilebilir. Kök olarak oturum açtıktan sonra başka bir kabuğa da geçebilirsiniz.
James O'Gorman

@ JamesO'Gorman İyi yakalama Cevabımı güncelledim.
Craig

20

STDERR'ı gizlemeye veya STDOUT'a yönlendirmeye çalıştığınızdan emin değilim.

STDOUT'u bir dosyaya yeniden yönlendirmek için:

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

STDOUT ve STDERR dosyalarını bir dosyaya yeniden yönlendirmek için:

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

STDOUT'u bir dosyaya yönlendirmek ve STDERR'ı gizlemek için:

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

STDOUT'u STDERR'yi konsoluna gizlemek ve gizlemek için:

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

STDOUT'u konsola ve STDERR'ı bir dosyaya yeniden yönlendirmek için:

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

STDOUT'u bir dosyaya ve STDERR dosyasını bir dosyaya yeniden yönlendirmek için:

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

DÜZENLEME: Bunun çalışmasının nedeni, () öğesindeki eylemin önce gerçekleşmesidir; Ergo, STDOUT'u yeniden yönlendirdiysek, artık () 'nin dışında kullanılamayacak. Bu bizi sadece STDERR ile bırakıyor ve sonra bunu istediğiniz gibi yönlendirebiliriz.


Merhaba @nikc, unix.SE'ye hoş geldiniz. Yorumunuz faydalı ve bilgilendirici. Cevabınızı düzenlemenizi ve oraya dahil etmenizi öneririm, bu yüzden kolayca kaçırılmaz.
drs

1

Csh içinde nasıl yapılacağını biliyorum, ama 2 kabuk kullanarak:

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

Böyle bir yol sadece stderr'i stdout olmadan file.txt'ye yönlendirir - yani ne istersen.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.