Я не могу найти на 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
означает следующее:
- Создать подпроцесс.
- Открыть
/tmp/foo
для записи файловый дескриптор 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