Встроенная в exec
оболочка (bash) заменяет текущую оболочку с заданным аргументом. Попробуйте exec sleep 1, например. Исполняемый файл xargs
является частью пакета GNU findutils. Он выполнит команду, данную ему как первый аргумент с аргументом, считанным из стандартного ввода.
Например:
$ echo -e "calves drink milk\npeople eat cows" | xargs -L1 cowsay
___________________
< calves drink milk >
-------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
_________________
< people eat cows >
-----------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
Приведенный вами пример "не работает", потому что список аргументов, состоящий из всех файлов на вашем компьютере и специальных файлов в /sys и /proc, становится слишком большим. Вы не можете попросить команду работать с произвольно большим списком аргументов, потому что есть предел (getconf ARG_MAX - я думаю, байты).
Однако иногда вы хотите что-то сделать с большим списком аргументов, и решение состоит в том, чтобы обрабатывать фрагменты списка, а не весь список одновременно.
Например:
$ cat tmp/moo.sh
#!/bin/sh
echo processing $# arguments
$ seq 0 10000 | xargs -L 1001 sh tmp/moo.sh | cat -n
1 processing 1001 arguments
2 processing 1001 arguments
3 processing 1001 arguments
4 processing 1001 arguments
5 processing 1001 arguments
6 processing 1001 arguments
7 processing 1001 arguments
8 processing 1001 arguments
9 processing 1001 arguments
10 processing 992 arguments
В последней части вашего вопроса о папках "тех Fd" о F Ile д escriptors. Когда вы запускаете find, он просматривает /proc и видит файловые дескрипторы (стандартный ввод, стандартный вывод, обычные файлы для чтения и записи) запущенных процессов. К тому времени, когда команды find выходят и xargs вступают во владение, некоторые из этих процессов могут уже не существовать. Таким образом, ошибки. Файлы в /dev /fd на самом деле являются только символическими ссылками:
$ ll /dev/fd/
total 0
lrwx------ 1 jaroslav jaroslav 64 Nov 18 01:57 0 -> /dev/pts/7
lrwx------ 1 jaroslav jaroslav 64 Nov 18 01:57 1 -> /dev/pts/7
lrwx------ 1 jaroslav jaroslav 64 Nov 18 01:57 2 -> /dev/pts/7
lr-x------ 1 jaroslav jaroslav 64 Nov 18 01:57 3 -> /proc/21677/fd
geee: ~
$ file /dev/pts/7
/dev/pts/7: character special
geee: ~
$ sudo echo "MOOOOOOO" >> /dev/pts/7
Password:
MOOOOOOO
То, что я там сделал, я написал в стандартный вывод моего терминала. Я понятия не имею, что представляет собой процесс 21677, но к тому времени, когда find /
завершение, я уверен, что он будет уничтожен, даже если он присутствовал во время поиска отсканированного /proc.