Перенаправление 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 >& /dev/stdout

???


   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.