/ proc / self adalah gula sintaksis. Ini adalah jalan pintas ke contatenating / proc / dan hasil dari getpid () syscall (dapat diakses di bash sebagai metavariable $$). Ini bisa membingungkan, dalam hal skrip shell, karena banyak pernyataan memanggil proses lain, lengkap dengan PID sendiri ... PID yang merujuk, lebih sering daripada tidak, proses mati. Mempertimbangkan:
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' akan mengevaluasi jalur ke direktori, menyelesaikannya sebagai / proc / 26563, karena itulah PID dari proses - proses / bin / ls yang baru dibuat - yang membaca isi direktori. Tetapi pada saat proses selanjutnya dalam pipeline, dalam kasus scripting shell, atau pada saat prompt kembali, dalam kasus shell interaktif, jalan tidak lagi ada dan output informasi mengacu pada proses yang tidak ada.
Ini hanya berlaku untuk perintah eksternal, namun (yang merupakan file program yang dapat dieksekusi, sebagai lawan dibangun ke dalam shell itu sendiri). Jadi, Anda akan mendapatkan hasil yang berbeda jika, misalnya, menggunakan nama file globbing untuk mendapatkan daftar isi direktori, daripada meneruskan nama path ke proses eksternal / 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
Pada baris pertama, shell memunculkan proses baru, '/ bin / ls', melalui syscall exec (), lewat "/ proc / self / fd" sebagai argv [1]. '/ bin / ls', pada gilirannya, membuka direktori / proc / self / fd dan membaca, lalu mencetak, isinya seperti yang diulang di atasnya.
Namun, baris kedua menggunakan glob () di belakang layar untuk memperluas daftar nama file; ini dilewatkan sebagai larik string yang bergema. (Biasanya diimplementasikan sebagai perintah internal, tetapi sering juga ada biner / bin / gema ... tetapi bagian itu sebenarnya tidak relevan, karena gema hanya berurusan dengan string yang tidak pernah diumpankan ke syscall yang terkait dengan nama path.)
Sekarang, pertimbangkan kasus berikut:
root@vps01:~# cd /proc/self/fd
root@vps01:~# ls
0 1 2 255
Di sini, shell, proses induk dari / bin / ls, telah membuat subdirektori dari / proc / self direktori saat ini . Dengan demikian, nama path relatif dievaluasi dari perspektifnya. Tebakan terbaik saya adalah bahwa ini terkait dengan semantik file POSIX di mana Anda dapat membuat banyak tautan keras ke file, termasuk deskriptor file terbuka. Jadi kali ini, / bin / ls berperilaku serupa dengan echo / proc / $$ / fd / *.
/proc/self
, tentu saja.