Ответ 1
Оболочка csh
никогда не была известна своей обширной способностью манипулировать файловыми дескрипторами в процессе перенаправления.
Вы можете перенаправить как стандартный вывод, так и ошибку в файл с помощью
xxx >& filename
но это не совсем то, что вам нужно, перенаправление стандартной ошибки на текущий стандартный вывод.
Однако если ваша базовая операционная система предоставляет стандартный вывод процесса в файловой системе (как Linux работает с /dev/stdout
), вы можете использовать этот метод следующим образом:
xxx >& /dev/stdout
Это приведет к тому, что стандартный вывод и стандартная ошибка будут идти в том же месте, что и текущий стандартный вывод, эффективно то, что у вас есть с перенаправлением bash
, 2>&1
.
Просто имейте в виду, что это не функция csh
. Если вы запускаете операционную систему, которая не предоставляет стандартный вывод в качестве файла, вы не можете использовать этот метод.
Однако существует и другой метод. Вы можете объединить два потока в один, если вы отправите его в конвейер с |&
, тогда все, что вам нужно сделать, - найти компонент конвейера, который записывает свой стандартный ввод в свой стандартный вывод. Если вы ничего не знаете о том, что именно делает cat
, если вы не дадите ему никаких аргументов. Следовательно, вы можете достичь своих целей в этом конкретном случае:
xxx |& cat
Конечно, также нет ничего, что помешало бы вам запустить bash
(предположив, что это в системе где-то) в пределах csh
script, чтобы предоставить вам дополнительные возможности. Затем вы можете использовать богатые перенаправления этой оболочки для более сложных случаев, когда csh
может работать.
Давайте рассмотрим это более подробно. Сначала создайте исполняемый файл echo_err
, который будет писать строку в stderr
:
#include <stdio.h>
int main (int argc, char *argv[]) {
fprintf (stderr, "stderr (%s)\n", (argc > 1) ? argv[1] : "?");
return 0;
}
Затем элемент управления script test.csh
, который покажет его в действии:
#!/usr/bin/csh
ps -ef ; echo ; echo $$ ; echo
echo 'stdout (csh)'
./echo_err csh
bash -c "( echo 'stdout (bash)' ; ./echo_err bash ) 2>&1"
echo
для PID и ps
просто так, что вы можете обеспечить csh
выполнение этого script. Когда вы запустите этот script с помощью:
./test.csh >test.out 2>test.err
(начальное перенаправление настроено на bash
, прежде чем csh
запустит script), и просмотрите файлы out/err
, вы увидите:
test.out:
UID PID PPID TTY STIME COMMAND
pax 5708 5364 cons0 11:31:14 /usr/bin/ps
pax 5364 7364 cons0 11:31:13 /usr/bin/tcsh
pax 7364 1 cons0 10:44:30 /usr/bin/bash
5364
stdout (csh)
stdout (bash)
stderr (bash)
test.err:
stderr (csh)
Вы можете видеть, что процесс test.csh
запущен в C-оболочке, а вызов bash
изнутри дает вам полное перенаправление bash
.
Команда 2>&1
в команде bash
довольно легко позволяет перенаправить стандартную ошибку на текущий стандартный вывод (по желанию) без предварительного знания того, где в настоящий момент идет стандартный вывод.