Haruskah saya menggunakan garis miring di akhir variabel path dalam skrip shell atau tidak? [Tutup]

11

Hari ini ketika menulis skrip shell saya.

Tiba-tiba sebuah pertanyaan muncul di benak saya.

Karena cd /target_dirdan cd /target_dir/keduanya bekerja.
Haruskah saya menambahkan garis miring di akhir variabel jalur saya di skrip shell?
Seperti LOG_PATH=/data/nginx/logsversus 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?

Zen
sumber
Tidak ada aturan. Kedua gaya pengkodean memiliki beberapa kelebihan dan beberapa kekurangan.
andcoz

Jawaban:

8

Menurut POSIX:

Definisi nama path:

String yang digunakan untuk mengidentifikasi file. Ini memiliki karakter awal <slash> opsional , diikuti oleh nol atau lebih nama file yang dipisahkan oleh karakter <slash> . Pathname secara opsional dapat berisi satu atau lebih karakter <slash> yang tertinggal . Beberapa <slash> karakter berturut-turut dianggap sama dengan satu <slash> , kecuali untuk kasus tepat dua karakter <slash> utama.

Mikhal
sumber
@ Sangat menarik, bahwa saya dapat melakukan cd ke //dan /dengan nama mereka menunjukkan berbeda pada bash prompt, dan menggunakan pwdsaya akan mendapatkan jalur yang berbeda ditampilkan, tetapi konten mereka identik! Mengapa?
Zen
1
Karena bashmelacak 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.
orion
Terkait: Perbedaan aneh antara pwd dan / bin / pwd .
G-Man Mengatakan 'Reinstate Monica'
6

Untuk berada di sisi yang aman, sertakan tebasan. Ini dapat menyebabkan beberapa garis miring ketika menyatukan jalur, tetapi setidaknya Anda menghindari masalah.

Beberapa contoh: rsyncmemperlakukan 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 bernama foo, tetapi Anda keliru berpikir itu adalah direktori dan ingin memindahkan sesuatu di dalamnya, maka mv bar fooakan menimpa file (kehilangan data, potensi bencana) tetapi mv 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.

orion
sumber
2

Tidak, seharusnya tidak. Ini menambahkan garis miring tambahan yang tidak perlu ( /).

contoh

katakanlah Anda ingin mengekspor bindirektori java ke PATHvariabel Anda ,

export PATH=$PATH:/opt/jre1.7.0_45/bin/

sekarang periksa,

user@host:~$ which java
/opt/jre1.7.0_45/bin//java

perhatikan slash tambahan ( /) sebelum java, tetapi untungnya hanya berfungsi dalam kasus seperti itu.

Arnab
sumber
Saya melihat di tautan ini ada jawaban 31 suara di mana penulis berpikir kita harus menambahkan garis miring. Saya bingung. stackoverflow.com/questions/980255/…
Zen
@ Zen, ya saya memeriksanya, Itu ada di komentar pertama pertanyaan Anda. Terima kasih.
Arnab
6
Lebih baik dua tebasan daripada tidak sama sekali. Yang ini jelek tapi aman ... pilihan lain jauh lebih buruk dan bisa berbahaya.
orion