ksh перенаправляет stdout и stderr на разные процессы

Как можно перенаправить каналы stdout и stderr nn ksh в UNIX? (не линукс).

Для перенаправления на файлы работает следующее:

x=0
while [[ "$x" -lt 100 ]]; do
    echo "junk" >&2
    echo "$x log test"
    echo "junk err" &>2
    echo "$x err test" >&2
    x=$(($x+1))
done 2>out1.err 1>out1.log

Я пробовал перенаправлять каналы на другие процессы, например следующее, но это не работает:

x=0
while [[ "$x" -lt 100 ]]; do
    echo "junk" >&2
    echo "$x log test"
    echo "junk err" &>2
    echo "$x err test" >&2
    x=$(($x+1))
done 2>&3 | sort -u > out2.log 3>&1 | sort -u > out2.err

person mathtick    schedule 27.06.2011    source источник


Ответы (2)


Замена процесса:

some_process 1> >(do_something_with stdout) 2> >(do_something_else_with stderr)
person glenn jackman    schedule 30.06.2011
comment
пропущен тег «ksh», это ссылка на руководство по bash. Тем не менее, синтаксис тот же. - person glenn jackman; 30.06.2011
comment
Спасибо за это. @Mathtick: Вот ссылка с примерами подстановки команд/процессов: linuxjournal.com/article/2156?page=0,1 - person tomkaith13; 30.06.2011

Это проблема с вашим кодом 2>&3 | sort -u > out2.log 3>&1. Канал не будет связывать FD или файл, пока команда не будет полностью выполнена.

Например, рассмотрим следующий файл bla:

bash-4.0$ cat bla
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

(ПРИМЕЧАНИЕ: файл с именем blu НЕ СУЩЕСТВУЕТ, пока я не выполню следующую команду.)

bash-4.0$ cat bla > blu | sort < blu

bash: blu: No such file or directory

Теперь, если вы укажете каталог, вы увидите созданный blu. Это потому, что cat bla > blu выполняется правильно, но файл не создается до тех пор, пока не будет выполнена вся команда. следовательно, когда сортировка пытается прочитать blu, она выдает ошибку, потому что ее не существует. Не совершайте ошибку, неправильно используя "|" для ";" . Они совершенно разные. Надеюсь, это помогло.

person tomkaith13    schedule 29.06.2011