przekierowanie stderr nie działa w csh

11

Uruchomię następujące polecenie:

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

Dane wyjściowe są nadal wyświetlane w terminalu. Kiedy naciskam , rozumiem

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

ze spacją przed2 .

Nie umieściłem tego pierwotnie. próbuję

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

Ponownie, kiedy naciskam , spacje zostały dodane .

Dlaczego tak się dzieje?

Używam csh na FreeBSD.

gadgetmo
źródło

Odpowiedzi:

12

Przekierowanie 2> nie działa z csh ani tcsh.

Użyj chshpolecenia, aby zmienić powłokę na / bin / sh lub / usr / local / bin / bash, aby użyć 2>przekierowania stylu. Uwaga: Nie zmieniaj powłoki roota na / usr / local / bin / bash

csh i tcsh nie mogą osobno przekierować standardowego wyjścia i błędu, ale >&przekierują połączone wyjście do pliku.

Craig
źródło
+1 i ✔. Zmieniłem powłoki za pomocą sh.
gadgetmo
1
@Craig Działa pkg_addna FreeBSD, więc zakładam , że jest to dla użytkownika root (/ bin / csh jest domyślny dla roota na FreeBSD). W tym przypadku należy nie zmienić powłokę na / usr / local / bin / bash. / bin / sh jest dopuszczalny. Możesz także po prostu przełączyć się na inną powłokę po zalogowaniu się jako root.
James O'Gorman
@ JamesO'Gorman Dobry połów Zaktualizowałem swoją odpowiedź.
Craig,
20

Nie jestem pewien, czy próbujesz ukryć STDERR lub przekierować go do STDOUT.

Aby przekierować STDOUT do pliku:

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

Aby przekierować STDOUT i STDERR do pliku:

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

Aby przekierować STDOUT do pliku i ukryć STDERR:

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

Aby przekierować STDOUT do konsoli i ukryć STDERR:

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

Aby przekierować STDOUT na konsolę i STDERR do pliku:

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

Aby przekierować STDOUT do pliku i STDERR do pliku:

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

EDYCJA: Powodem, dla którego to działa, jest to, że akcja w () jest pierwsza; Ergo, jeśli przekierowaliśmy STDOUT, to nie będzie już dostępny poza (). To pozostawia nam tylko STDERR, a następnie możemy przekierować to zgodnie z potrzebami.

nikc
źródło
Cześć @nikc, witamy na unix.SE. Twój komentarz jest przydatny i zawiera informacje. Sugeruję edycję odpowiedzi i umieszczenie jej tam, aby nie było jej tak łatwo pominąć.
drs
1

Wiem jak to zrobić w Csh, ale używając 2 powłok:

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

Taki sposób pozwala przekierować tylko stderr do file.txt, bez stdout - czyli tego, co chciałeś.

Alexander Samoylov
źródło