/ 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 і прочитав, а потім надрукував його вміст, як він повторив над ними.
Однак другий рядок використовує глобул () за лаштунками для розширення списку імен файлів; вони передаються у вигляді масиву рядків для відлуння. (Зазвичай реалізується як внутрішня команда, але часто також є / bin / echo бінарний ... але ця частина насправді не має значення, оскільки echo має справу лише з рядками, вона ніколи не подається до жодного syscall, пов'язаного з іменами шляху.)
Тепер розглянемо такий випадок:
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
, звичайно.