Когда я запускаю следующую команду в csh
, я ничего не получаю, но она работает в bash
. Есть ли эквивалент в csh
, который может перенаправить стандартную ошибку на стандартный вывод?
somecommand 2>&1
Когда я запускаю следующую команду в csh
, я ничего не получаю, но она работает в bash
. Есть ли эквивалент в csh
, который может перенаправить стандартную ошибку на стандартный вывод?
somecommand 2>&1
Оболочка csh
никогда не была известна своей обширной способностью манипулировать файловыми дескрипторами в процессе перенаправления.
Вы можете перенаправить как стандартный вывод, так и ошибку в файл с помощью:
xxx >& filename
но это не совсем то, что вам нужно, перенаправляя стандартную ошибку на текущий стандартный вывод.
Однако, если ваша базовая операционная система предоставляет стандартный вывод процесса в файловой системе (как это делает Linux с /dev/stdout
), вы можете использовать этот метод следующим образом:
xxx >& /dev/stdout
Это заставит как стандартный вывод , так и стандартную ошибку перейти в то же место, что и текущий стандартный вывод, фактически то, что у вас есть с перенаправлением bash
, 2>&1
.
Просто имейте в виду, что это не функция csh
. Если вы работаете в операционной системе, которая не предоставляет стандартный вывод в виде файла, вы не можете использовать этот метод.
Однако есть и другой метод. Вы можете объединить два потока в один, если отправите его в конвейер с помощью |&
, тогда все, что вам нужно сделать, это найти компонент конвейера, который записывает свой стандартный ввод в свой стандартный вывод. В случае, если вы не знаете о такой вещи, это именно то, что cat
делает, если вы не приводите никаких аргументов. Следовательно, вы можете достичь своих целей в этом конкретном случае с помощью:
xxx |& cat
Конечно, ничто не мешает вам запустить bash
(при условии, что он находится где-то в системе) внутри скрипта 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)
Вы можете видеть, что процесс test.csh
запускается в оболочке C, и что вызов bash
оттуда дает вам полную bash
возможность перенаправления.
2>&1
в команде bash
довольно легко позволяет вам перенаправить стандартную ошибку на текущий стандартный вывод (по желанию) без предварительного знания того, куда в данный момент идет стандартный вывод.
tee
подходит для этой работы. Отправка данных через tee
как на стандартный вывод, так и на /dev/null
ничем не отличается от отправки данных через cat
на просто стандартный вывод. Поэтому я обновил его с этой опцией, но спасибо за информацию, это очень помогло.
- person paxdiablo; 05.08.2015
cmd >& /dev/stderr
на самом деле полностью испортил мой сеанс NoMachine, хотя команда была в удаленной системе из этого сеанса. Я проголосовал за этот ответ в прошлом, поэтому, по-видимому, он работал в прошлом, но я предлагаю это второе мнение, чтобы остерегаться.
- person esmit; 03.08.2017
Я возражаю против приведенного выше ответа и предоставляю свой собственный. csh
ИМЕЕТ эту возможность, и вот как это делается:
xxx |& some_exec # will pipe merged output to your some_exec
or
xxx |& cat > filename
или если вы просто хотите объединить потоки (в стандартный вывод) и не перенаправлять в файл или some_exec:
xxx |& tee /dev/null
csh
, за исключением использования хитрости временного вызова оболочки bash
.
- person paxdiablo; 03.07.2014
csh
. p.s. Я не могу в это поверить, но... решение о том, как объединить stderr с stdout через tee /dev/null
, является лучшим. ... чм-ч
- person Trevor Boyd Smith; 23.09.2020
Как сказал paxdiablo, вы можете использовать >&
для перенаправления как stdout, так и stderr. Однако, если вы хотите, чтобы они были разделены, вы можете использовать следующее:
(command > stdoutfile) >& stderrfile
... как указано выше, перенаправит stdout в stdoutfile и stderr в stderrfile.
Как насчет просто
xxx >& /dev/stdout
???
xxx >& filename
Или сделайте это, чтобы увидеть все на экране и перейти к вашему файлу:
xxx | & tee ./logfile
Я думаю, что это правильный ответ для csh.
xxx >/dev/stderr
Обратите внимание, что большинство csh на самом деле являются tcsh в современных средах:
ремоклер> ls -latr /usr/bin/csh
lrwxrwxrwx 1 root root 9 03.05.2011 13:40 /usr/bin/csh -> /bin/tcsh
используя встроенный оператор обратной кавычки, чтобы изобразить это следующим образом:
echo "`echo 'standard out1'` `echo 'error out1' >/dev/stderr` `echo 'standard out2'`" | tee -a /tmp/test.txt ; cat /tmp/test.txt
если это работает для вас, увеличьте до 1. Другие предложения не работают для моей среды csh.