Apa perbedaan antara perintah berikut?
mv foo bar
mv foo/ bar/
mv foo/ bar
mv foo bar/
Atau tidak ada perbedaan? Atau apakah itu tergantung pada perintah yang digunakan? Pikirkan misalnya saya membaca bahwa perilaku rsync sedikit berubah tergantung pada versi yang Anda gunakan. Adakah yang memiliki penjelasan yang baik sehingga saya tidak perlu menebak lagi dan merasa seperti saya tahu apa yang saya lakukan?
Jawaban:
Banyak utilitas Unix memperlakukan symlink secara berbeda tergantung pada apakah ada garis miring.
Perilaku ini dijelaskan dalam dokumentasi POSIX Symbolic Link dan juga disebutkan dalam dokumentasi GNU coreutils .
Pada dasarnya, trailing slash berarti mengikuti (atau "dereference") symlink.
Misalnya, dalam kode di bawah ini,
dirlink
berarti symlink, tetapidirlink/
berarti direktori yang ditunjuk symlink.rm
tidak akan menghapus direktori kecuali jika Anda mengatakannyarm -r
, tetapirm
tanpa opsi dengan senang hati akan menghapus symlink.Ini juga berguna untuk melihat izin direktori, tanpa harus repot apakah direktori tersebut adalah direktori nyata atau hanya symlink ke direktori.
dan masih berfungsi untuk direktori reguler:
Contoh lain adalah
find
perintah. Jikapath
Anda memintanya untuk mencari adalah symlink, itu tidak akan mengikuti symlink secara default, artinya hanya memproses symlink. Menambahkan garis miring menjadikannya memperlakukan symlink sebagai direktori yang menunjuk ke tautan.(beberapa versi find memiliki
-follow
atau-L
opsi, tetapi itu membuatnya mengikuti semua symlink, bukan hanya yang pertama)Dalam kasus
rsync
, apakah Anda harus menambahkan garis miring tergantung pada apakah Anda ingin direktori yang Anda salin menjadi subdirektori atau tidak.Dengan kata lain:
rsync dir dir.bak
salinandir
kedir.bak
, membuatdir
bagian dalamdir.bak
rsync dir/ dir.bak
menyalin semua isidir
, tanpa membuatdir
bagian dalamnyadir.bak
sumber
Seperti yang sudah dikatakan jsalonen, perintah ini memang memiliki hasil yang identik jika
foo
danbar
, pada kenyataannya, adalah direktori.Namun, jika
foo
danbar
bukan direktori, maka perintah akan gagal jika Anda menambahkan garis miring, dan akan berhasil jika Anda tidak. Masalahnya, jika perintah berhasil, itu mungkin tidak akan memiliki hasil yang Anda maksudkan. Bahkan, Anda bahkan bisa kehilangan data jikafoo
danbar
file (bar
akan ditimpa).Jika maksud Anda adalah untuk menentukan direktori dan bukan file, maka Anda harus menggunakan garis miring, karena itu membuat perintah lebih kuat: jika harapan itu
foo
ataubar
direktori gagal, maka perintah akan gagal dengan anggun, bukannya memiliki hasil yang tidak terduga.Juga, beberapa perintah (jarang) berperilaku berbeda tergantung dari keberadaan garis miring, bahkan dengan direktori (salah satu contohnya
rsync
).sumber