O shell (bash) incorporado em exec
substitui o shell atual pelo argumento fornecido. Tente exec sleep 1, por exemplo. O executável xargs
faz parte do pacote GNU findutils. Ele executará o comando dado a ele como o primeiro argumento com argumento lido da entrada padrão.
Por exemplo:
$ echo -e "calves drink milk\npeople eat cows" | xargs -L1 cowsay
___________________
< calves drink milk >
-------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
_________________
< people eat cows >
-----------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
O exemplo que você forneceu "não funciona" porque a lista de argumentos que consiste em todos os arquivos no seu computador e os arquivos especiais em / sys e / proc crescem demais. Você não pode pedir a um comando para trabalhar em uma lista arbitrariamente grande de argumentos porque existe um limite (getconf ARG_MAX - bytes eu acho).
Às vezes, você quer fazer algo com uma grande lista de argumentos, e uma solução é processar partes da lista e não toda a lista de uma só vez.
Por exemplo:
$ 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
A última parte da sua pergunta sobre as pastas "fd" é sobre os descritores f ile d . Quando você executar find, ele irá procurar em / proc e ver os descritores de arquivos (entrada padrão, saída padrão, arquivos regulares para leitura e gravação) dos processos em execução. No momento em que encontrar saídas e xargs assumir, alguns desses processos podem não existir mais. Assim os erros. Arquivos em / dev / fd são, na verdade, apenas links simbólicos:
$ 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
O que eu fiz lá é que eu escrevi para a saída padrão do meu terminal. Eu não tenho idéia do que é o processo 21677, mas pelo tempo find /
finishes, tenho certeza que ele será destruído mesmo se estivesse presente no momento em que encontrar scanned / proc.