Перенаправить stderr в stdout в C оболочка


когда я запускаю следующую команду в csh, Я ничего не имею, но он работает в bash, есть ли эквивалент в csh который может перенаправить стандартную ошибку на стандартный выход?

somecommand 2>&1
6 53

6 ответов:

The csh shell никогда не был известен своей обширной способностью манипулировать дескрипторами файлов в процессе перенаправления.

вы можете перенаправить стандартный вывод и вывод ошибок в файл с:

xxx >& filename

но это не совсем то, что вы искали, перенаправляя стандартную ошибку на настоящее стандартный вывод.


однако, если ваша операционная система предоставляет стандартный вывод процесса в файловой системе (как Linux работает с /dev/stdout), вы можете использовать этот метод следующим образом:

xxx >& /dev/stdout

это заставит оба стандартных вывода и Стандартная ошибка, чтобы перейти к тому же месту, что и текущий стандартный выход, эффективно то, что у вас есть с bash например, 2>&1.

просто имейте в виду, что это не csh характеристика. Если вы работаете на операционной системе, что не выставить стандартный вывод в файл, вы не можете использовать этот метод.


однако есть и другой способ. Вы можете объединить два потока в один, если вы отправляете его в трубопровод С |&, то все, что вам нужно сделать, это найти компонент конвейера, который записывает свой стандартный вход в свой стандартный выход. В случае, если вы не знаете о такой вещи, это именно то, что 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"

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 >& /dev/stdout

???

   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.