Что делает exec {fd} </ dev / watchdog 'в Bash

28

Это буквально, а {fd}не заполнитель. У меня есть скрипт, который делает это, и ни в коем случае не использует источник, и нигде не ссылается {fd} Это действительный Bash?

exec {fd}</dev/watchdog

Грегг Левенталь
источник

Ответы:

34

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

exec 4< /dev/watchdog  # Was 4 in use? Who knows?

эта запись просит оболочку выбрать файловый дескриптор, который в данный момент не используется, открыть файл для чтения по этому дескриптору и присвоить номер данной переменной ( fd).

$ exec {fd}< /dev/watchdog
$ echo $fd
10
chepner
источник
Я уверен, что вы правы, потому что (1) я вспоминаю, что где-то читал, и (2) я просто попробовал (и это работает). Но я не мог найти это нигде. (Конечно, у меня было меньше десяти минут на поиск, прежде чем вы опубликовали свой ответ.) Можете ли вы дать ссылку на то, где он задокументирован?
Скотт
2
Смотрите справочную страницу, 2-й абзац раздела REDIRECTIONS. Это действительно не бросается в глаза, так как они не дают явного примера.
Чепнер
Вы правы, я пропустил это в man bash, но это там, где вы сказали. Следует отметить, что любое слово, а не только fd будет работать в скобках, и что оно присваивает fd> = 10.
Грегг Левенталь
3
@Scott, он не только в bash, но только в bash 4.1 или новее (поэтому недоступен в выпусках 3.2, все еще используемых в MacOS).
Чарльз Даффи
2
@CharlesDuffy /dev/watchdogтакже не существует в Mac OS X; это специфичное для Linux устройство.
сумерки
11

Форма:

{var}<filename

сделал оболочку открытым файлом filenameдля чтения и сохранения номера дескриптора файла в переменной var. Между {var}операторами и операторами перенаправления не должно быть пробела , и номер дескриптора файла будет больше или равен 10.

Эта функция была оригинальна из ksh(начиная с версии ksh93r в 2006 году), bashскопировал его много позже bash-4.1-alphaс 2010 года zshтакже изменение ранее чем bashс zsh 4.3.42007 года.

cuonglm
источник
2

Это объясняется в разделе руководства Bash по перенаправлениям .

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

Barmar
источник