2016-12-30 3 views
4

Я надеюсь, что кто-то сможет объяснить явление. Поскольку заголовок указывает, что я узнаю о перенаправлении файловых дескрипторов. По пути я столкнулся с вопросом, связанным с использованием символа перенаправления, особенно при настройке постоянного перенаправления. Я заметил, что в некоторых случаях, кажется, не имеет значения, пользуюсь ли я < или >. Например, работая со следующим сценарием:Bash: перенаправление дескрипторов файлов

#!/bin/bash 

#Setting file descriptor 3 to redirect to STDIN 
exec 3<&0 

#Setting STDIN to read from input file 
exec 0<inputFile 


while read var 
do 
    echo "$var" 

done 

#Setting STDIN to read from file descriptor 3 which is redirected to the default STDIN 
exec 0<&3 

read -p "Enter a word:" word 

echo "$word" 

К моему удивлению, это, кажется, не имеет значения, если я использую > или < в заявлениях exec 3<&0 или exec 0<&3. В любом из этих утверждений кажется, что если я заменю символы переадресации, я все равно получаю тот же результат. Кажется очевидным, что делает одни и те же типы изменений в линии:

exec 0<inputFile 

против

exec 0>inputFile 

не дает те же результаты, потому что перенаправлять STDIN в файл не то же самое как перенаправление файла в STDIN.

Так что мои вопросы:

  1. < против >:

    # Why aren't there any differences between these two statements? 
    exec 3<&0 
    exec 3>&0 
    
  2. 3<&0 против 0<&3:

    # Why is there a difference between these two statements? 
    exec 3<&0 
    exec 0<&3 
    

Этот тип перенаправления достаточно сложно для меня, чтобы обернуть мою голову и держать прямо без этих несоответствий. Любое объяснение (ы) будет принята с благодарностью.

+1

Я слегка отредактирован свой пост, чтобы отразить оба вопроса, которые вы просили. Не стесняйтесь отскакивать или редактировать дальше, если вам не нравятся мои изменения! –

ответ

5

Когда дублирования дескрипторов файлов, это не имеет значения, dup2 называется, независимо от того, если вы используете < или >.

То же самое происходит, когда закрытие дескрипторы файлов. Вы можете использовать n>&- или n<&-.


Однако почему же тогда 0<&3 не то же самое, как 3<&0?

Вот объяснено в dup2 спецификации я связан:

int dup2(int fildes, int fildes2); 

dup2() функция должна потерпеть неудачу, если:

[EBADF]

В Филдс аргумент недействительный дескриптор открытого файла или аргумент fildes2 отрицательно или больше или равно {OPEN_MAX}.

В случае exec 0<&3, Bash вызывает dup2(3,0) и действительно получает EBADF ошибку (так как мы в случае Филдс = 3, который не является допустимым дескриптором открытого файла в то время). Вы можете легко проверить, что с strace:

$ strace -e dup2 bash -c 'exec 0>&3' 
dup2(3, 0)        = -1 EBADF (Bad file descriptor) 
bash: 3: Bad file descriptor 
dup2(10, 0)        = 0 
+++ exited with 1 +++ 
+0

Хорошо, что имеет смысл. Возможно, некоторые из моих замешательств проистекают из моей книги, описывающей это как «перенаправление» файловых дескрипторов, когда их следует рассматривать как «дублирование» их? Однако почему тогда «0 <& 3» не то же самое, что «3 <& 0»? –

+1

@ Dr.Tautology: пост отредактирован, чтобы ответить на ваш вопрос! –

+0

Хорошо, я думаю, я сейчас полностью понимаю. Хотя в вашем редактировании вы говорите, что «fildes = 3, который в то время не является допустимым дескриптором открытого файла». Это не верно для последнего экземпляра exec в скрипте. В этот момент 3 дескриптора файла были открыты? Однако, учитывая то, что вы здесь изложили, я думаю, что лучший способ думать обо всем этом - это дублирование, а не перенаправление. Если я так думаю об этом, кажется, что вся путаница исчезнет. «0 <& 3» - это не то же самое, что «3 <& 0», потому что дублирование 3 не совпадает с дублированием 0. Большое спасибо за то, что принесли мне эту ясность. –

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