stderr перенаправлення не працює в csh


11

Я запускаю таку команду:

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

Вихід все ще відображається в терміналі. Коли я натискаю , я отримую

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

з пробілом перед2 .

Я спочатку цього не ставив. я спробую

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

Знову, коли я натискаю , додаються пробіли .

Чому це відбувається зі мною?

Я запускаю csh на FreeBSD.

Відповіді:


12

Перенаправлення 2> не працює з csh або tcsh.

Використовуйте chshкоманду, щоб змінити оболонку на / bin / sh або / usr / local / bin / bash, щоб використовувати 2>переадресацію стилю. Примітка. Не змінюйте оболонку кореня на / usr / local / bin / bash

csh і tcsh не можуть перенаправляти стандартні помилки та помилки окремо, але >&переспрямують комбінований вихід у файл.


+1 і ✔. Я міняв раковини, використовуючи sh.
гаджетмо

1
@Craig Він працює pkg_addна FreeBSD, тому я припускаю, що це для кореневого користувача (/ bin / csh є типовим для root на FreeBSD). В цьому випадку ви повинні НЕ змінити оболонку в / USR / місцеві / бен / Баш. / бін / ш є прийнятним. Ви також можете просто перейти на іншу оболонку після входу в систему як root.
Джеймс О'Горман

@ JamesO'Gorman Хороший улов Я оновив свою відповідь.
Крейг

20

Я не впевнений, ви намагаєтесь приховати STDERR або перенаправити його на STDOUT.

Щоб перенаправити STDOUT у файл:

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

Щоб перенаправити STDOUT та STDERR у файл:

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

Щоб перенаправити STDOUT у файл та сховати STDERR:

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

Щоб перенаправити STDOUT на консоль та приховати STDERR:

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

Щоб перенаправити STDOUT на консоль та STDERR у файл:

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

Щоб перенаправити STDOUT у файл та STDERR на файл:

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

EDIT: Причина цього працює в тому, що дія в () відбувається першим; Ergo, якщо ми перенаправили STDOUT, він більше не буде доступний за межами (). Це залишає нам лише STDERR, і тоді ми можемо перенаправити це за бажанням.


Привіт @nikc, ласкаво просимо до unix.SE. Ваш коментар корисний та інформативний. Я б запропонував відредагувати свою відповідь і включити її туди, щоб її не так просто пропустити.
вр

1

Я знаю, як це зробити в Csh, але використовуючи 2 оболонки:

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

Такий спосіб дозволяє перенаправляти лише stderr на file.txt, без stdout - а саме те, що ви хотіли.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.