В форме `exec FD>` exec

В форме `exec FD>` exec

Я не могу найти на zshстранице руководства ничего, что бы точно объясняло, что делает следующее (например)

exec 3> /tmp/foo

Вся соответствующая документация, которую я смог найти, execотносится к форме, в которой execза ней следует «простая команда». (Например, см.man zshbuiltins, иman zshmisc.) ( exec FD>Форма кратко упоминается вman zshmisc, но в отрывке, который, как мне кажется, предполагает, что эта форма была полностью и надлежащим образом задокументирована в другом месте.)

Я посмотрел все хиты, созданные

man zshall | grep -P '\bexec\b'

...но ни один из них не был тем, что я искал.

Знает ли кто-нибудь хорошую замену отсутствующей документации?


PS: Возможным объяснением того, что мне кажется «отсутствующей документацией», является то, что такие формы, как exec 3> /tmp/fooна самом деле, являются частными случаями формы «exec простая команда". Однако если это так, то я хотел бы найти документацию, которая объясняет (1) как, например, 3> /tmp/fooявляется простой командой (если я запускаю эту "простую команду" в командной строке, она просто зависает, пока я не нажму ^C); и (2) почему код в скрипте, происходящий после чего-то вроде , exec 3> /tmp/fooвычисляется, тогда как тот, который происходит после, скажем, exec dateне вычисляется.

решение1

Значения execс командой и без команды не связаны. Я полагаю, что встроенное имя перегружено, потому что одно значение не имеет смысла с командой, а другое не имеет смысла без команды, поэтому, сделав это таким образом, удалось избежать необходимости придумывать новое имя, которое затем нельзя было бы использовать для другой команды.

Theруководствосостояния:

Есликомандаопущен, но указаны какие-либо перенаправления, то перенаправления вступят в силу в текущей оболочке.

Это означает, что что-то вроде exec 3> /tmp/fooизменяет то, на что указывает файловый дескриптор 3 в запущенном процессе оболочки. Фрагмент оболочки типа /bin/somecommand 3>/tmp/fooозначает следующее:

  1. Создать подпроцесс.
  2. Открыть /tmp/fooдля записи файловый дескриптор 3 в подпроцессе.
  3. Выполнить файл /bin/somecommandв подпроцессе.

exec 3>/tmp/fooпросто выполняет шаг 3, ничего не делая с процессами.

После exec 3>/tmp/foo, все последующие обращения к файловому дескриптору 3 из оболочки и ее подпроцессов идут к /tmp/foo, как и при любом другом перенаправлении. Например, предположим, что вы запускаете следующий скрипт в терминале, не подключенном ни к чему к файловому дескриптору 3:

echo hello           # prints to the terminal
echo nope >&3        # complains about a bad descriptor since no file is open on fd 3
exec >/tmp/out 3>/tmp/three
echo hello           # writes to /tmp/out
echo howdy >&3       # writes to /tmp/three
echo wibble >&3      # writes a second line to /tmp/three

Связанный контент