2012-02-24 2 views
0

Я запускаю tcsh/csh shell на своей машине. В последнее время я понял, что перенаправление файлов stderr не работает.методы перенаправления stderr

Пожалуйста, найдите терминальные журналы, как показано ниже:

>echo b c >>& log 
>cat log 
b c 
>echo $a b c >>& log 
a: Undefined variable. 
>cat log 
b c 

Я никогда не сталкивался с такой проблемой, поэтому не знает, как для отладки или устранение неполадок. Прошу совета!

Измененный способ перенаправления использует тройник. Пока я использую> & или >> &, я полностью блокирую любой вывод, который будет отображаться на терминале. Есть ли способ, которым я могу сделать оба, то есть: для каждого оператора

a) Прямой stdout + stderr в файл.

б) дисплей стандартный вывод + STDERR на терминале

мне нужно, чтобы проверить, действительно ли я могу использовать что-то вроде этого (ниже), чтобы удовлетворить мои требования

>csh ./script_name | tee -a log 

В моем случае это только направляет Stdout войти файл и блоки stderr.

ответ

1

Я почти уверен, что оценка $a делается с помощью текущей оболочки, перед тем переназначения устанавливаются для echo субоболочки?

Это, кажется, подтверждается тем фактом, что echo на самом деле не писать в файл на всех, которые вы могли бы увидеть, если вы удалили файл log до второй попытки:

[pax ~]$ echo b c >>& log 

[pax ~]$ cat log 
b c 

[pax ~]$ rm log 

[pax ~]$ echo $a b c >> & log 
a: Undefined variable. 

[pax ~]$ cat log 
cat: log: No such file or directory 

А также тем, что, если запустить echo в явных подоболочках перенаправления сделано для субоболочки, а не echo, вы получите желаемый результат:

[pax ~]$ (echo $a b c) >> & log 

[pax ~]$ cat log 
b c 
a: Undefined variable. 

В самом деле, вы можете видеть это, даже используя работоспособную команду:

[pax ~]$ rm log 

[pax ~]$ $xyzzy 
xyzzy: Undefined variable. 

[pax ~]$ $xyzzy >>&log 
xyzzy: Undefined variable. 

[pax ~]$ cat log 
cat: log: No such file or directory 

Причина этого заключается в том, что текущая оболочка жалуется пытается оценить $xyzzy. Это имеет смысл. С помощью команды:

someCmd $HOME 

someCmd исполняемый файл будет никогда увидеть буквальное $HOME, он фактически заменяется значением. И эта замена выполняется оболочкой до того, как someCmd даже настроен (включая изменение его стандартных входных или выходных потоков).

+0

Я не уверен, как это проверить. Из того, что я понимаю, даже если интерпретация выполняется для $ a, он не должен останавливать выполнение, но должен направлять stdout + stderr в файл журнала. – Ani

+0

@ Ани, вы можете проверить это, как и я, путем принудительного перенаправления сначала _then_ делать расширение, a la '(echo $ a) >> & log'. Я обновил ответ более подробно. – paxdiablo

+0

Спасибо за ответ, что делает его более понятным для меня, как выполняются инструкции. – Ani

0

Вы не можете выполнять манипуляции с файловыми дескрипторами и мантру, которые в течение последних 20 лет отражались на эхо в Csh Programming is considered harmful.

Существует множество альтернативных оболочек и даже/bin/sh - лучший вариант для программирования скриптов, чем tcsh/csh. Я надеюсь, что после этого времени никто не заставит вас использовать csh.

+0

Вы можете проголосовать, но csh не может 2> & 1 – tawman

+0

Вы правы в этом, но я не уверен, что именно это имеет отношение к рассматриваемому вопросу. Я считаю, что компиляторы из некоторых крупных безымянных компаний неадекватны по стандартам ISO, но когда меня спрашивают о них, я не говорю о том, как должен переключиться на gcc :-) Вы не отлаживаете несовершеннолетних как это, изменяя и переучивая все ваши инструменты. – paxdiablo

+0

@paxdiablo Человек спрашивает, почему я не могу перенаправить stderr в файл, и мой ответ - вы не можете. CSH не поддерживает его. Это далеко от ложного аргумента, который вы предлагаете. Полностью не связан. – tawman

Смежные вопросы