/ proc / self é o açúcar sintático. É um atalho para a contatenação / proc / e o resultado do getysc () do syscall (acessível no bash como o metavariable $$). Pode ficar confuso, no caso do shell de script, já que muitas das instruções invocam outros processos, completos com os próprios PIDs ... PIDs que se referem, na maioria das vezes, a processos mortos. Considere:
root@vps01:~# ls -l /proc/self/fd
total 0
lrwx------ 1 root root 64 Jan 1 01:51 0 -> /dev/pts/0
lrwx------ 1 root root 64 Jan 1 01:51 1 -> /dev/pts/0
lrwx------ 1 root root 64 Jan 1 01:51 2 -> /dev/pts/0
lr-x------ 1 root root 64 Jan 1 01:51 3 -> /proc/26562/fd
root@vps01:~# echo $$
593
'/ bin / ls' irá avaliar o caminho para o diretório, resolvendo-o como / proc / 26563, já que esse é o PID do processo - o recém-criado processo / bin / ls - que lê o conteúdo do diretório. Mas no momento em que o próximo processo no pipeline, no caso de scripts de shell, ou no momento em que o prompt volta, no caso de um shell interativo, o caminho não existe mais e as informações saída refere-se a um processo inexistente.
Isso só se aplica a comandos externos, no entanto (aqueles que são arquivos de programas executáveis reais, ao invés de serem embutidos no próprio shell). Assim, você obterá resultados diferentes se, digamos, usar o globbing de nomes de arquivos para obter uma lista do conteúdo do diretório, em vez de passar o nome do caminho para o processo externo / bin / ls:
root@vps01:~# ls /proc/self/fd
0 1 2 3
root@vps01:~/specs# echo /proc/self/fd/*
/proc/self/fd/0 /proc/self/fd/1 /proc/self/fd/2 /proc/self/fd/255 /proc/self/fd/3
Na primeira linha, o shell gerou um novo processo, '/ bin / ls', através do exec () syscall, passando "/ proc / self / fd" como argv [1]. '/ bin / ls', por sua vez, abriu o diretório / proc / self / fd e leu, em seguida, imprimiu seu conteúdo à medida que era iterado sobre eles.
A segunda linha, no entanto, usa glob () nos bastidores para expandir a lista de nomes de arquivos; estes são passados como um array de strings para ecoar. (Geralmente implementado como um comando interno, mas muitas vezes há também um bin / bin / echo ... mas essa parte é irrelevante, já que echo está lidando apenas com strings que nunca são alimentadas por syscalls relacionados a nomes de caminhos.)
Agora, considere o seguinte caso:
root@vps01:~# cd /proc/self/fd
root@vps01:~# ls
0 1 2 255
Aqui, o shell, o processo pai / bin / ls, criou um subdiretório de / proc / self em seu diretório atual . Assim, caminhos relativos são avaliados a partir de sua perspectiva. Meu melhor palpite é que isso está relacionado à semântica do arquivo POSIX, onde você pode criar vários hard links para um arquivo, incluindo qualquer descritor de arquivo aberto. Então, desta vez, / bin / ls se comporta de maneira semelhante a echo / proc / $$ / fd /*.