/ proc / self - это синтаксический сахар. Это ярлык для соединения с / proc / и результатом системного вызова getpid () (доступного в bash как метавариабельная $$). Это может сбить с толку, в случае сценариев оболочки, так как многие операторы вызывают другие процессы, в комплекте с собственными PID ... PID, которые чаще всего ссылаются на мертвые процессы. Рассмотреть возможность:
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» оценит путь к каталогу, разрешив его как / proc / 26563, поскольку это PID процесса - недавно созданный процесс / bin / ls - который считывает содержимое каталога. Но к тому времени, когда следующий процесс в конвейере, в случае сценариев оболочки или ко времени возврата приглашения, в случае интерактивной оболочки, путь больше не существует, и вывод информации относится к несуществующему процессу.
Однако это относится только к внешним командам (которые являются фактическими исполняемыми программными файлами, а не встроены в саму оболочку). Таким образом, вы получите другие результаты, если, скажем, будете использовать глобализацию имени файла для получения списка содержимого каталога, а не передавать имя пути во внешний процесс / 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
В первой строке оболочка порождает новый процесс, '/ bin / ls', через системный вызов exec (), передавая "/ proc / self / fd" как argv [1]. «/ bin / ls», в свою очередь, открыл каталог / proc / self / fd и прочитал, а затем распечатал его содержимое, повторяя их.
Вторая строка, однако, использует glob () за кулисами, чтобы расширить список имен файлов; они передаются как массив строк для эха. (Обычно реализуется как внутренняя команда, но часто также есть двоичный файл / bin / echo ... но эта часть на самом деле не имеет значения, так как echo имеет дело только со строками, которые он никогда не передает в любой системный вызов, связанный с путевыми именами.)
Теперь рассмотрим следующий случай:
root@vps01:~# cd /proc/self/fd
root@vps01:~# ls
0 1 2 255
Здесь оболочка, родительский процесс / bin / ls, сделала подкаталог / proc / self своим текущим каталогом . Таким образом, относительные пути оцениваются с его точки зрения. Я думаю, что это связано с семантикой файлов POSIX, где вы можете создать несколько жестких ссылок на файл, включая любые дескрипторы открытого файла. Так что на этот раз / bin / ls ведет себя подобно echo / proc / $$ / fd / *.
/proc/self
, конечно.