Перенаправить stderr в stdout в C оболочка
когда я запускаю следующую команду в csh, Я ничего не имею, но он работает в bash, есть ли эквивалент в csh который может перенаправить стандартную ошибку на стандартный выход?
somecommand 2>&1
6 ответов:
The
cshshell никогда не был известен своей обширной способностью манипулировать дескрипторами файлов в процессе перенаправления.вы можете перенаправить стандартный вывод и вывод ошибок в файл с:
xxx >& filenameно это не совсем то, что вы искали, перенаправляя стандартную ошибку на настоящее стандартный вывод.
однако, если ваша операционная система предоставляет стандартный вывод процесса в файловой системе (как Linux работает с
/dev/stdout), вы можете использовать этот метод следующим образом:xxx >& /dev/stdoutэто заставит оба стандартных вывода и Стандартная ошибка, чтобы перейти к тому же месту, что и текущий стандартный выход, эффективно то, что у вас есть с
bashнапример,2>&1.просто имейте в виду, что это не
cshхарактеристика. Если вы работаете на операционной системе, что не выставить стандартный вывод в файл, вы не можете использовать этот метод.
однако есть и другой способ. Вы можете объединить два потока в один, если вы отправляете его в трубопровод С
|&, то все, что вам нужно сделать, это найти компонент конвейера, который записывает свой стандартный вход в свой стандартный выход. В случае, если вы не знаете о такой вещи, это именно то, чтоcatесли вы не даете никаких аргументов. Следовательно, вы можете достичь своих целей в этом конкретные случае с:xxx |& cat
конечно, ничто не мешает вам бежать
bash(предполагая, что это где-то в системе) внутри acshскрипт даст вам дополнительные возможности. Затем вы можете использовать богатые перенаправления этой оболочки для более сложных случаев, когда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"The
echoПИД и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)вы можете видеть, что есть что элемент
test.cshпроцесс и работает в оболочке C, и это вызовbashизнутри там дает вам полныйbashвласть перенаправление.The
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/cshlrwxrwxrwx 1 root root 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.