Перенаправить stderr в stdout в C оболочка
когда я запускаю следующую команду в csh
, Я ничего не имею, но он работает в bash
, есть ли эквивалент в csh
который может перенаправить стандартную ошибку на стандартный выход?
somecommand 2>&1
6 ответов:
The
csh
shell никогда не был известен своей обширной способностью манипулировать дескрипторами файлов в процессе перенаправления.вы можете перенаправить стандартный вывод и вывод ошибок в файл с:
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/csh
lrwxrwxrwx 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.