Estou usando Ubuntu 22.04.3 LTS
Quando executo ls /proc/$$/fd
obtive o seguinte resultado
0 1 2 255
Mas quando executo ls /proc/$$/fd/*
obtive o seguinte resultado
ls: não é possível acessar '/proc/126708/fd/3': arquivo ou diretório inexistente /proc/126708/fd/0 /proc/126708/fd/1 /proc/126708/fd/2 /proc/126708/fd /255
Mas não sei por que obtive resultados diferentes
A coisa mais importante a perceber é que os curingas não são expandidos por 'ls' – eles são expandidos pelo shell. Isto tem dois efeitos:
No seu segundo exemplo, a linha de comando que 'ls' realmente recebe é uma lista de cinco nomes exatos, já expandidos naquele ponto. (Variáveis como $$ também são expandidas.) Portanto, o comando exato que está realmente sendo executado é:
(Você pode ver isso usando 'forkstat' ou 'execsnoop' ou possivelmente 'strace -f -e execve -p 126708'.)
Quando o shell é solicitado a expandir um
*
curinga, ele precisa abrir o diretório para listar seu conteúdo – e isso cria um descritor de arquivo; especificamente fd #3 neste caso.Portanto, a lista expandida de descritores de arquivos do shell é auto-referencial e inclui o mesmo fd #3 que está sendo usado para produzir a lista.
Depois que o shell termina de expandir os curingas, ele fecha o fd do diretório novamente, fazendo com que 'fd/3' desapareça do diretório "live" /proc/126708. No entanto, o item não desaparece da lista de arquivos que a expansão curinga acabou de produzir – uma vez lá, estará lá e será passado para 'ls'.
Resumindo, a
/proc/126708/fd/3
entrada aparece durante a expansão do curinga, por causa da expansão do curinga, e depois desaparece antes que o comando 'ls' seja executado.Você pode obter um efeito auto-referencial semelhante fazendo
ls -l /proc/self/fd
, que listará os descritores de arquivo mantidos pelo próprio 'ls' – você verá que um deles corresponde ao diretório /proc/self/fd. (Não há mensagem de erro neste caso porque a listagem é feita em uma única etapa.)