/ proc / self to cukier składniowy. Jest to skrót do contatenating / proc / i wyniku polecenia getpid () syscall (dostępnego w bash jako metawaria $$). W przypadku skryptów powłoki może to być mylące, ponieważ wiele instrukcji wywołuje inne procesy wraz z własnymi PID ... PID, które odnoszą się najczęściej do martwych procesów. Rozważać:
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' oceni ścieżkę do katalogu, rozwiązując ją jako / proc / 26563, ponieważ jest to PID procesu - nowo utworzony proces / bin / ls - który czyta zawartość katalogu. Ale do czasu następnego procesu w potoku, w przypadku skryptów powłoki lub do czasu powrotu monitu, w przypadku powłoki interaktywnej ścieżka już nie istnieje, a informacje wyjściowe odnoszą się do nieistniejącego procesu.
Dotyczy to jednak tylko zewnętrznych poleceń (tych, które są rzeczywistymi plikami programów wykonywalnych, w przeciwieństwie do wbudowania w samą powłokę). Otrzymasz różne wyniki, jeśli, powiedzmy, użyjesz globowania nazw plików, aby uzyskać listę zawartości katalogu, zamiast przekazywać nazwę ścieżki do zewnętrznego procesu / 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
W pierwszym wierszu powłoka odrodziła nowy proces „/ bin / ls” za pośrednictwem syscall exec (), przekazując „/ proc / self / fd” jako argv [1]. Z kolei „/ bin / ls” otworzył katalog / proc / self / fd i przeczytał, a następnie wydrukował jego zawartość podczas iteracji nad nimi.
Druga linia używa jednak glob () za kulisami, aby rozwinąć listę nazw plików; są one przekazywane jako tablica ciągów do echa. (Zwykle implementowane jako polecenie wewnętrzne, ale często występuje również plik binarny / bin / echo ... ale ta część jest właściwie nieistotna, ponieważ echo zajmuje się tylko ciągami znaków, których nigdy nie przekazuje do żadnego wywołania systemowego związanego z nazwami ścieżek.)
Teraz rozważ następujący przypadek:
root@vps01:~# cd /proc/self/fd
root@vps01:~# ls
0 1 2 255
Tutaj powłoka, proces macierzysty / bin / ls, utworzył podkatalog / proc / self w swoim bieżącym katalogu . W związku z tym względne nazwy ścieżek są oceniane z perspektywy. Domyślam się, że jest to związane z semantyką pliku POSIX, w której można utworzyć wiele dowiązań twardych do pliku, w tym wszelkie otwarte deskryptory plików. Tym razem / bin / ls zachowuje się podobnie do echa / proc / $$ / fd / *.
/proc/self
Oczywiście proces, który ocenia .