2017-01-13 13 views
3

В ударе, раз в FD используется (либо как вход или выход):Может ли существующий fd всегда дублироваться как как входной, так и выходной?

exec 7>AFile 

Похоже, что это число FD может быть повторен, и как вход или выход:

true <&7; echo $? 
true >&7; echo $? 

тесты могут быть повторены для переменной, как:

fd=7 
rco="$(true >&${fd} 2>/dev/null; echo $?)" 
rci="$(true <&${fd} 2>/dev/null; echo $?)" 

И оба значения выхода соединены в одно слово, как:

[[ "$rco$rci" = "11" ]] && echo "The fd number $fd is free" 

Возникает вопрос:

При каких условиях будет значение выхода "$rco$rci" отличаться от 11 для «свободного» номер Fd.

Другими словами: может быть 10 или 01 иногда?

Может ли это быть в других оболочках?

ответ

3

Никогда. Под капотом перераспределение будет пытаться установить dup существующий или бесплатный filedescriptor, а затем оболочка должна перейти к запуску true, если предварительные перенаправления удались.

dup Неотложный дескриптор должен всегда срабатывать, что фактически означает, что попытка повторного перенаправления в любом направлении должна быть достаточной для проверки того, открыт ли файл-указатель.

(С другой стороны, dup Использование открытого дескриптора должно выполняться почти всегда. Это не удается, когда вы исчерпали свой лимит на файловую систему для каждого процесса, который обычно равен 1024-4096, и теоретически вы можете получить разрешение с ошибкой, если shell попытался сбросить открытые флаги, но черты, bash и zsh, похоже, не пытаются это сделать. У меня возникают ошибки ввода-вывода, когда я на самом деле пытаюсь написать обманутый readonly filedescriptor, а не во время перенаправления.)

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

  • Нет связанных вопросов^_^