Hari ini ketika menulis skrip shell saya.
Tiba-tiba sebuah pertanyaan muncul di benak saya.
Karena cd /target_dir
dan cd /target_dir/
keduanya bekerja.
Haruskah saya menambahkan garis miring di akhir variabel jalur saya di skrip shell?
Seperti LOG_PATH=/data/nginx/logs
versus LOG_PATH=/data/nginx/logs/
.
Saya melakukan beberapa pencarian di google, tetapi tidak menemukan diskusi tentang ini, mungkin itu terlalu mendasar?
Untuk saat ini, sangat sulit bagi saya untuk memutuskan gaya mana yang harus dipilih.
Tapi saya lebih suka LOG_PATH=/target_dir/
gaya.
Karena ketika saya melakukan pelengkapan otomatis dengan bash, hasilnya muncul dengan slash.
Apa pendapat Anda tentang ini, mengapa?
shell
shell-script
Zen
sumber
sumber
Jawaban:
Menurut POSIX:
sumber
//
dan/
dengan nama mereka menunjukkan berbeda pada bash prompt, dan menggunakanpwd
saya akan mendapatkan jalur yang berbeda ditampilkan, tetapi konten mereka identik! Mengapa?bash
melacak direktori saat ini dengan cara yang sangat naif, sebagai string. Itu hanya menambahkan dan menghapus dari path heuristically, itu tidak menautkan ke sistem file yang sebenarnya. Salah satu konsekuensi adalah bahwa Anda dapat melakukan cd ke tautan simbolis dan kembali dengan cara yang sama (jika bash tidak memutuskan itu terlalu banyak dan menginisialisasi ulang itu). Yang lain adalah apa yang Anda gambarkan. Anda tidak harus bergantung pada pelacakan shell dari direktori saat ini, itu tidak dapat diandalkan.Untuk berada di sisi yang aman, sertakan tebasan. Ini dapat menyebabkan beberapa garis miring ketika menyatukan jalur, tetapi setidaknya Anda menghindari masalah.
Beberapa contoh:
rsync
memperlakukan jalur berbeda jika slash tertinggal disertakan (mensinkronisasikan bahwa direktori alih-alih membuat subdirektori lain). Tautan simbolis ke direktori terkadang berperilaku dengan cara yang tidak terduga ketika mereka tidak memiliki garis miring - setidaknya penyelesaian shell menjadi bingung. Anda tidak pernah tahu apakah perintah / skrip yang Anda gunakan bergantung pada pengecekan slash untuk beberapa perilaku khusus. Bahkan bisa menyelamatkan Anda dari menimpa sesuatu. Misalnya, jika Anda memiliki file bernamafoo
, tetapi Anda keliru berpikir itu adalah direktori dan ingin memindahkan sesuatu di dalamnya, makamv bar foo
akan menimpa file (kehilangan data, potensi bencana) tetapimv bar foo/
hanya akan mengeluh dan tidak melakukan apa-apa.Jadi untuk menyimpulkan, itu sebagian besar kasus itu tidak masalah, tetapi Anda harus menggunakan garis miring untuk melindungi diri Anda sendiri, dan juga untuk membuatnya lebih jelas bagi pembaca manusia apa yang ingin Anda lakukan dalam naskah. Pengamat biasa akan segera memastikan bahwa variabel merujuk ke direktori jika berakhir dengan garis miring, dan akan menggunakannya dengan benar jika perlu dimodifikasi.
sumber
Tidak, seharusnya tidak. Ini menambahkan garis miring tambahan yang tidak perlu (
/
).contoh
katakanlah Anda ingin mengekspor
bin
direktori java kePATH
variabel Anda ,export PATH=$PATH:/opt/jre1.7.0_45/bin/
sekarang periksa,
perhatikan slash tambahan (
/
) sebelum java, tetapi untungnya hanya berfungsi dalam kasus seperti itu.sumber