Подтвердить что ты не робот

Перенаправить stderr в stdout в c shell

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

 xxx 2>&1

Примечание: xxx является недопустимой командой, я просто хочу сделать ошибку, чтобы увидеть результат.

4b9b3361

Ответ 1

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

Вы можете перенаправить как стандартный вывод, так и ошибку в файл с помощью

xxx >& filename

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


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

xxx >& /dev/stdout

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

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


Однако существует и другой метод. Вы можете объединить два потока в один, если вы отправите его в конвейер с |&, тогда все, что вам нужно сделать, - найти компонент конвейера, который записывает свой стандартный ввод в свой стандартный вывод. Если вы ничего не знаете о том, что именно делает cat, если вы не дадите ему никаких аргументов. Следовательно, вы можете достичь своих целей в этом конкретном случае:

xxx |& cat

Конечно, также нет ничего, что помешало бы вам запустить bash (предположив, что это в системе где-то) в пределах csh script, чтобы предоставить вам дополнительные возможности. Затем вы можете использовать богатые перенаправления этой оболочки для более сложных случаев, когда csh может работать.

Давайте рассмотрим это более подробно. Сначала создайте исполняемый файл echo_err, который будет писать строку в stderr:

#include <stdio.h>
int main (int argc, char *argv[]) {
    fprintf (stderr, "stderr (%s)\n", (argc > 1) ? argv[1] : "?");
    return 0;
}

Затем элемент управления script 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 выполнение этого script. Когда вы запустите этот script с помощью:

./test.csh >test.out 2>test.err

(начальное перенаправление настроено на bash, прежде чем csh запустит script), и просмотрите файлы 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.

Команда 2>&1 в команде bash довольно легко позволяет перенаправить стандартную ошибку на текущий стандартный вывод (по желанию) без предварительного знания того, где в настоящий момент идет стандартный вывод.

Ответ 2

Я рассматриваю вышеуказанный ответ и предоставляю свои собственные. csh У этой функции есть и вот как это делается:

xxx |& some_exec # will pipe merged output to your some_exec 

или

xxx |& cat > filename

или если вы просто хотите, чтобы он объединил потоки (в стандартный вывод), а не перенаправлял файл или some_exec:

xxx |& tee /dev/null

Ответ 3

Как сказал paxdiablo, вы можете использовать >& для перенаправления как stdout, так и stderr. Однако, если вы хотите их разделить, вы можете использовать следующее:

(command > stdoutfile) >& stderrfile

... как указано выше, перенаправление stdout на stdoutfile и stderr на stderrfile.

Ответ 4

Как насчет просто

xxx >& /dev/stdout

???

Ответ 5

   xxx >& filename

Или сделайте это, чтобы увидеть все на экране и перейдите в свой файл:

  xxx | & tee ./logfile

Ответ 6

Я думаю, что это правильный ответ для csh.

xxx >/dev/stderr

Обратите внимание, что большинство csh действительно являются tcsh в современных средах:

rmockler > ls -latr /usr/bin/csh

lrwxrwxrwx 1 корень 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.