Пример верен на практике.Оригинальное объяснение книги - точное описание того, что говорит стандарт POSIX, но POSIX-подобные оболочки, которые у меня есть (bash
и dash
, единственные, которые, как мне кажется, обычно встречаются в Linux), не настолько придирчивы.
Стандарт POSIX говорит то же самое, что и книга о дескрипторах ввода и вывода, и продолжает так: для n<&word
, "если цифры в word
не представляютдескриптор файла, уже открытый для ввода, приведет к ошибке перенаправления ".Поэтому, если вы хотите быть осторожнее с POSIX-совместимостью, вам следует избегать такого использования.
В документации bash также говорится то же самое о <&
и >&
, но без обещанияошибки.Что хорошо, потому что это не дает ошибки.Вместо этого эмпирически n<&m
и n>&m
кажутся взаимозаменяемыми.Единственная разница между <&
и >&
состоит в том, что если вы оставите номер fd слева, <&
по умолчанию будет 0 (стандартный) и >&
- 1 (стандартный).
ДляНапример, давайте запустим оболочку с fd 1, указывающей на файл bar
, затем попробуем в точности пример exec 4<&1
, попробуйте записать получившийся fd 4 и посмотреть, работает ли он:
$ sh -c 'exec 4<&1; echo foo >&4' >bar; cat bar
foo
Да, и это справедливо при использовании dash
или bash
(или bash --posix
) для оболочки.
Под капотом это имеет смысл, потому что <& и> & почти наверняка просто вызывают dup2 () , которому все равно, открыты ли fds для чтения, записи или добавления или что.
[ EDIT : добавлена ссылка на POSIX после обсужденияв комментариях.]