указав номер дескриптора файла? - PullRequest
4 голосов
/ 06 августа 2010

Насколько я понимаю, никто не может контролировать дескриптор файла (целое число), назначенный ОС, при открытии нового файла с помощью open (). Как тогда возможно в оболочке bash назначить определенный файловый дескриптор с помощью команды, подобной

exec 5>&1

(Полагаю, я мог бы узнать это, прочитав исходники bash ...)

Ответы [ 3 ]

3 голосов
/ 12 декабря 2011

Я считаю, что вы правы, что иногда файловые дескрипторы уже могут использоваться.Я получил это от http://tldp.org/LDP/abs/html/io-redirection.html#FTN.AEN17716

"Использование файлового дескриптора 5 может вызвать проблемы. Когда Bash создает дочерний процесс, как и в случае с exec, дочерний процесс наследует fd 5 (см. Архивную электронную почту Чет Рэми, ПРЕДМЕТ: RE: Файловый дескриптор 5 остается открытым ). Лучше оставить этот конкретный файл в покое. "

Решение этой проблемы указано в разделе 3.6 параграфа 2 руководства по bash.

Каждому перенаправлению, которому может предшествовать номер дескриптора файла, вместо этого может предшествовать слово вида {varname}.В этом случае для каждого оператора перенаправления, кроме> & - и <& -, оболочка выделит дескриптор файла больше 10 и присвоит его {varname}.Если> & - или <& - предшествует {varname}, значение varname определяет дескриптор файла для закрытия. </em>

Например,

#!/bin/bash

exec {NEW_STDOUT}>&1
echo "Hello" >&$NEW_STDOUT
exec {NEW_STDOUT}>&-
3 голосов
/ 06 августа 2010

См. dup2 системный вызов Unix.

1 голос
/ 06 августа 2010

Кроме того, файловые дескрипторы назначаются последовательно, поэтому, если вы знаете, что 0, 1, 2, ..., n уже открыты и ни один из них не закрыт, следующим будет n + 1.

...