О форме `exec FD>` в exec

Если вы хотите использовать find , вы должны добавить флаг -mindepth 1 , чтобы уровень ниже ваших исходных каталогов был обнаружен первым.

Однако вы также можете использовать несколько разных инструментов, например ls -d * / , чтобы распечатать имена каталогов.

2
02.11.2016, 02:50
1 ответ

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

В руководстве указано:

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

Это означает, что что-то вроде 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
2
27.01.2020, 22:10

Теги

Похожие вопросы