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://$
. ls
menunjukkan 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.
Jawaban:
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 menjalankanreadlink /proc/self/cwd
akan memberitahu; juga,/usr//local///bin
diciutkan 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, ketikacd
memasuki 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.sumber
zsh
memungkinkancd //
, tetapi cukup pintar untuk hanya ditampilkan/
di string cepat.Dari definisi pathname POSIX:
Sumber
Dan lebih tepatnya seperti grawity yang disebutkan dalam komentarnya di bawah ini, dari bab 4.11 tentang Resolusi Pathname:
sumber
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 /sumber
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;)
sumber
//
pada prompt adalah efek samping dari variabel lingkungan prompt Anda ($PS1
) - bagaimanaPS1
didefinisikan?$PS1
variabel didefinisikan sebagai[\u@\h \W]\$
. Ada masalah dengan pengaturan?/
ketika pwd =/
. Saya bertanya-tanya apakah Anda melakukan pekerjaan tambahan untuk mendapatkan direktori. Sudah$PROMPT_COMMAND
diatur?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.PS1
danPROMPT_COMMAND
- gunakanman bash
di baris perintah Anda atau baca onlineFiturnya 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.
konten lengkap dari variabel proyek adalah
sumber