Перенаправление stderr в stdout в оболочке C
когда я запускаю следующую команду в csh
, У меня ничего нет, но он работает в bash
, есть ли какой-либо эквивалент в csh
что может перенаправить стандартную ошибку в standard out?
somecommand 2>&1
6 ответов
на csh
shell никогда не был известен своей обширной способностью манипулировать дескрипторами файлов в процессе перенаправления.
вы можете перенаправить стандартный вывод и вывод ошибок в файл с:
xxx >& filename
но это не совсем то, что вам было нужно, перенаправляя стандартную ошибку на настоящее стандартный вывод.
однако, если ваша операционная система предоставляет стандартный вывод процесса в файловой системе (как Linux работает с /dev/stdout
), вы можете использовать этот метод следующим образом:
xxx >& /dev/stdout
это заставит оба стандартных вывода и Стандартная ошибка для перехода в то же место, что и текущий стандартный вывод, эффективно то, что у вас есть с bash
например, 2>&1
.
просто имейте в виду, что это не csh
характеристика. Если вы работаете в операционной системе, которая не expose стандартный вывод в виде файла, вы не можете использовать это метод.
однако есть другой метод. Вы можете объединить два потока в один, если вы отправите его в трубопровод С |&
, тогда все, что вам нужно сделать, это найти компонент конвейера, который записывает свой стандартный ввод в стандартный вывод. В случае, если вы не знаете о такой вещи, это именно то, что cat
если вы не даете никаких аргументов. Следовательно, вы можете достичь своих целей в этом конкретные случае с:
xxx |& cat
конечно, там также ничего не мешает вам работать bash
(предполагая, что он где-то в системе) внутри a csh
скрипт даст вам дополнительные возможности. Затем вы можете использовать богатые перенаправления этой оболочки для более сложных случаев, когда csh
может бороться.
давайте рассмотрим это более подробно. Сначала создайте исполняемый файл echo_err
это напишет строку для stderr
:
#include <stdio.h>
int main (int argc, char *argv[]) {
fprintf (stderr, "stderr (%s)\n", (argc > 1) ? argv[1] : "?");
return 0;
}
тогда скрипт управления 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
запуск этого сценария. При запуске этого скрипта:
./test.csh >test.out 2>test.err
(первоначальное перенаправление настраивается bash
до csh
запускает скрипт), и изучите 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)
вы можете видеть, что есть что the test.csh
процесс is работает в оболочке C, и это вызов bash
изнутри дает вам полный bash
власть перенаправление.
на 2>&1
на bash
команда довольно легко позволяет перенаправить стандартную ошибку на настоящее стандартный выход (как пожелано) без предварительного знания где стандартный выход в настоящее время идет.
Я протестую ответ выше и своих собственных. csh
имеет эту возможность, и вот как это делается:
xxx |& some_exec # will pipe merged output to your some_exec
или
xxx |& cat > filename
или если вы просто хотите объединить потоки (в stdout) и не перенаправлять в файл или some_exec:
xxx |& tee /dev/null
Как сказал paxdiablo, вы можете использовать >&
для перенаправления stdout и stderr. Однако, если вы хотите их разделить, вы можете использовать следующее:
(command > stdoutfile) >& stderrfile
...как указано выше, перенаправляет stdout в stdoutfile и stderr в stderrfile.
xxx >& filename
или сделайте это, чтобы увидеть все на экране и перейти к вашему файлу:
xxx | & tee ./logfile
Я думаю, что это правильный ответ для csh.
xxx >/dev/stderr
Примечание большинство csh действительно tcsh в современных условиях:
rmockler> ls -latr /usr/bin/csh
lrwxrwxrwxrwx 1 корень корень 9 2011-05-03 13: 40 /usr/bin/csh -> /bin/tcsh
используя встроенный оператор backtick, чтобы изобразить это следующим образом:
echo "`echo 'standard out1'` `echo 'error out1' >/dev/stderr` `echo 'standard out2'`" | tee -a /tmp/test.txt ; cat /tmp/test.txt
если это работает для Вас, пожалуйста, поднять до 1. Другие предложения не работают для моей среды csh.