2014-08-28 3 views
1

Меня что-то беспокоит. Я хочу, чтобы перенаправить поток ошибок в позволяет говорить FD 5. Так что я выполнить следующую команду:Перенаправление stderr

[email protected]/home/me>$ exec &2>5 

[1]  307 

Так что я ожидаю, как результат этого Перенаправление, что теперь ошибки будут отправить Fd 5. Но это что происходит:

[email protected]/home/me>$ mkdir /a 5>/dev/null 
mkdir: /a: [Permission denied] 

На пороге отображается ошибка на стандартном выводе. В то время, когда я перенаправляю 2, он ничего не показывает:

[email protected]/home/me>$ mkdir /a 2>/dev/null 

Может кто-нибудь объяснить, где я ошибаюсь?

+1

Параметр 'exec' и' mkdir' независимые команды в оболочке. 'Exec' не перенаправляет' 2' на '5' для всех последующих команд (* i.e. *, эффект не является постоянным). См. Http://stackoverflow.com/questions/2821577/is-there-a-way-to-make-linux-cli-io-redirection-persistent. – lurker

+1

Вы не хотите 'exec 2>/some/file' в интерактивной оболочке: приглашение bash напечатано на stderr –

+0

, но как мне переименовать stderr 2? Если я хочу назвать его 5, как мне это сделать? – CuriousGuy

ответ

1
exec &2>5 

Это не перенаправляет stderr в файл с дескриптором 5. Он перенаправляет его в файл с именем 5. Обратите внимание, что, как упоминалось в комментарии glenn jackman, это делается в подоболочке, созданной только по фону exec (используемый вами & не означает, что 2 будет рассматриваться как дескриптор файла. Это означает, что exec будет вызываться в фоновом режиме !

mkdir /a 5>/dev/null 

Этот перенаправлены дескриптор файла 5 для /dev/null

Вы можете перенаправить stderr в файл, например так:.

mkdir /a 2>some-file 

Теперь посмотрим на разницу между ними:

mkdir /a 2>&1   # redirect stderr to fd 1, which is stdout 
mkdir /a 2>1   # redirect stderr to file named "1" 
mkdir /a >x 2>&1  # redirect stdout to x, AND stderr to stdout, which also goes into x 
mkdir /a 2>&5   # redirect stderr to fd 5, presuming there IS an open file with fd 5 
+3

еще хуже, 'exec & 2> 5' переадресовывает stderr в файл« 5 »только в подоболочке, созданной по фону« exec » –

+0

glenn jackman: да, спасибо за этот комментарий. Я обновил ответ! – Jay

Смежные вопросы