Direktori mana yang dilambangkan oleh path `//` di Linux?

13

Ketika saya ingin kembali ke direktori level atas di Linux dengan mengetik cd .., saya mengetik cd //. Saya sangat terkejut, tidak ada kesalahan yang dilaporkan. Terlebih lagi menjadi prompt username@hostname://$. lsmenunjukkan bahwa saya sekarang berada di direktori root.

Apakah ini bug atau fitur dari shell? Jika suatu fitur, apakah //itu alias /? Shell saya adalah GNU bash, versi 4.1.5 (1) -release (i686-linux-gnu).

Terima kasih dan salam.

Summer_More_More_Tea
sumber
Lihat superuser.com/q/314102/91047
Stéphane Gimenez

Jawaban:

30

Itu bisa dipertimbangkan juga.

Di Linux, //tidak ada artinya - beberapa garis miring berturut-turut diciutkan menjadi satu, di mana saja di jalur, termasuk permulaan. Mengubah direktori untuk //menempatkan Anda /, seperti menjalankan readlink /proc/self/cwdakan memberitahu; juga, /usr//local///bindiciutkan menjadi /usr/local/bin.

Namun, beberapa sistem mirip Unix lainnya, misalnya Cygwin atau Apollo Domain / OS lama, menggunakan // awalan untuk jalur jaringan seperti //fileserver/path/to/data. POSIX memungkinkan ini juga.

Karena berbagai alasan, bash shell melacak direktori saat ini sendiri (selain pelacakan yang disediakan OS) dan memiliki kode di dalamnya yang mencegah inisial //tidak diciutkan, agar tetap kompatibel dengan sistem tersebut. "Fitur" adalah bahwa bash menyediakan pelacakan yang lebih intuitif dari direktori saat ini, misalnya, ketika cdmemasuki symlink, bash akan menunjukkan kepada Anda jalur yang Anda harapkan, meskipun kernel berpikir sebaliknya. "Bug" adalah bahwa bash mengizinkan //bahkan pada sistem yang tidak menggunakannya.

pengguna1686
sumber
Menariknya, zshmemungkinkan cd //, tetapi cukup pintar untuk hanya ditampilkan /di string cepat.
new123456
@BinaryZebra Bitsavers memiliki koleksi manual Unix lama, termasuk Apollo - harus ada banyak contoh di sana. Situs web TUHS harus memiliki sesuatu juga.
user1686
Terima kasih banyak, saya menemukan deskripsi untuk // dalam manual Bitsavers.
9

Dari definisi pathname POSIX:

Pathname secara opsional dapat mengandung satu atau lebih garis miring. Beberapa tebasan berturut-turut dianggap sama dengan satu tebasan.

Sumber

Dan lebih tepatnya seperti grawity yang disebutkan dalam komentarnya di bawah ini, dari bab 4.11 tentang Resolusi Pathname:

Pathname yang dimulai dengan dua tebasan berturut-turut dapat diinterpretasikan dengan cara yang ditentukan implementasi, meskipun lebih dari dua tebasan utama harus diperlakukan sebagai tebasan tunggal.

Shadok
sumber
1
Bagian yang lebih tepat adalah 4.11 Resolusi Pathname (paragraf terakhir), karena perilaku yang dimaksud hanya muncul untuk dua garis miring utama .
user1686
3

Ini semacam fitur. Jika skrip shell berjalan dan digunakan find, misalnya semua jalur diawali dengan ./ biasanya. Kemudian, jika Anda menempelkannya ke jalur aktual, ia menjadi `/ my/path/./appended/path, yang memutuskan ke / my / path / appended / path. Jadi, jika saya tidak salah, // get diartikan sebagai /./ dan karenanya /. Ini sama karena jika Anda pergi ke / home / user //, Anda akan berakhir di / home / user /

Chuck R
sumber
1

Saya akan pergi untuk segera menampilkan "bug".

Entah jalur "/", "//", "//////////////////////", ... memiliki arti yang sama: "/". Anda dapat menambahkan sebanyak "/" di mana pun Anda inginkan di jalur Unix, ini tidak mengubah artinya.

"Bug" lebih banyak di sini terkait dengan fakta bahwa prompt Anda menggunakan jalur yang diketik terakhir yang valid untuk tampilan, bukan "pwd" yang sebenarnya.

Lagipula lucu;)

Ouki
sumber
Setuju - //pada prompt adalah efek samping dari variabel lingkungan prompt Anda ( $PS1) - bagaimana PS1didefinisikan?
Doug Harris
@DougHarris $PS1variabel didefinisikan sebagai [\u@\h \W]\$. Ada masalah dengan pengaturan?
Summer_More_More_Tea
Aneh. Jika saya mencoba PS1 itu, saya hanya mendapatkan satu /ketika pwd = /. Saya bertanya-tanya apakah Anda melakukan pekerjaan tambahan untuk mendapatkan direktori. Sudah $PROMPT_COMMANDdiatur?
Doug Harris
@DougHarris Ya, variabel ini disetel, yang nilainya adalah echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/#HOME/~}"; echo -ne "\007". Bisakah Anda jelaskan sedikit detail? Saya tidak begitu akrab dengan dua variabel ini. Terima kasih.
Summer_More_More_Tea
Baca halaman manual bash dan cari PS1dan PROMPT_COMMAND- gunakan man bashdi baris perintah Anda atau baca online
Doug Harris
1

Fiturnya dan semua multipel // akan diganti menjadi satu tunggal /

Ini berguna jika Anda memiliki variabel dengan path seperti contoh di akhir. Jadi cd Anda tidak akan mendapatkan kesalahan dan Anda tidak perlu mengubah variabel ruang kerja.

MY_WORKSPACE = / home / your_username / workspace /
MY_NEW_PROJECT = $ MY_WORKSPACE / my_proj /
cd $ MY_NEW_PROJECT 

konten lengkap dari variabel proyek adalah

/ home / your_username / workspace // my_proj /

phschoen
sumber