Apakah ini praktik yang baik untuk meminta garis miring ke belakang dalam nama direktori?

9

Saya ingin meminta pengguna skrip bash saya untuk melewatkan jalur direktori sebagai argumen. Manakah dari berikut ini yang merupakan praktik pemrograman yang baik?

  • Mengharuskan pengguna memasukkan trailing / (garis miring)
  • Mengharuskan pengguna untuk tidak memasukkan trailing / (garis miring)
Rohit Agarwal
sumber
3
Perhatikan bahwa rsyncberperilaku berbeda dalam cara yang sangat penting tergantung pada keberadaan trailing /, dan dalam beberapa kasus Anda ingin menormalkan konsistensi, dan dalam kasus lain Anda ingin melewati dengan bersih untuk mengimplementasikan apa yang dikatakan pengguna (jika mereka tahu mereka sedang berbicara rsync).
sh1
Satu lagi yang mengejutkan saya baru-baru ini adalah yang ls -l dirberperilaku berbeda ls -l dir/jika dirsymlink ke direktori.
Flimm

Jawaban:

27

Praktik terbaik adalah dengan tidak mengasumsikan keduanya.

Jika Anda memiliki akses ke utilitas / kelas pembuat jalur gunakan itu, jika tidak menulis kode Anda untuk menerima salah satu format dan bertindak sesuai.

Tidak ada yang lebih menyebalkan bagi pengguna daripada harus mengingat apakah akan menambahkan garis miring atau tidak.

ChrisF
sumber
6
Konsekuensi: Selalu parsing jalur dengan alat baris perintah yang sesuai - dirname, basenamedan readlink. Masalah yang sangat umum digunakan ${path##*/}sebagai pengganti basename, tetapi jika jalur berakhir dengan garis miring yang mengembalikan string kosong, bukan elemen jalur terakhir.
l0b0
1
+1 untuk menggunakan kelas utilitas. Saya tidak bisa mengatakan berapa kali saya melihat pengembang menemukan kembali roda ketika harus merakit jalan, ketika sebagian besar kerangka kerja dapat melakukannya dengan mudah saat ini.
RationalGeek
1
Juga, saya sangat kesal ketika beberapa aplikasi mengharuskan saya untuk melakukan ini dengan cara tertentu. Dan kadang-kadang pengguna tidak bisa mengendalikan cara menulis jalur itu: Kadang-kadang mereka menulisnya, jadi ya, mereka memilih untuk menulis dengan atau tanpa trailing slash, tetapi dalam kasus di mana pengguna autocomplet menggunakan TAB, banyak shell menempatkan trailing slash, jadi Anda akan meminta pengguna untuk menghapusnya? Dan yang lebih menjengkelkan adalah ketika sebuah aplikasi berperilaku berbeda jika Anda meletakkan garis miring di sebuah direktori yang disahkan sebagai argumen ( rsyncSaya melihat Anda)
Carlos Campderrós
Baru-baru ini saya perlu memverifikasi garis miring dari input pengguna untuk digunakan dengan rsync (karena sensitif terhadap hal-hal ini). Seperti yang dicatat oleh @ChrisF, adalah praktik terbaik untuk mengasumsikan keduanya. Saya datang dengan berikut ini sebagai cara anggun untuk tidak mengasumsikan: ${STR}$(printf \\$(printf '%03o' $(($(printf '%d' "'${STR:(-1)}")==47?0:47))))Saya juga mendokumentasikannya dalam inti untuk kejelasan: menambah atau menghapus garis miring dalam bash
John Mark Mitchell
10

Karena bash mengabaikan beberapa garis miring, Anda dapat dengan aman berasumsi bahwa pengguna tidak memasukkan garis miring di jalur dan menambahkan garis miring sendiri.

cat /etc/hosts

sama seperti

cat /////etc//////////hosts

Jadi skrip Anda dapat terlihat seperti itu:

echo -n "enter path: "
read path
if [ -f $path/myfile ]
then
  echo "found myfile!"
else
  echo "nope"
fi

dan Anda tidak perlu khawatir apakah pengguna memasukkan trailing / di jalur atau tidak.

pengguna281377
sumber
5
Nit: Itu bukan bashperilaku, kernel yang melakukannya.
Blrfl
7

Almarhum Jon Postel memiliki beberapa saran hebat di bagian 3.2 dari RFC 760 yang berlaku di sini:

Secara umum, suatu implementasi harus konservatif dalam perilaku pengirimannya, dan liberal dalam perilaku penerimaannya. Artinya, harus hati-hati untuk mengirim datagram yang terbentuk dengan baik, tetapi harus menerima datagram apa pun yang dapat diinterpretasikan (misalnya, tidak keberatan dengan kesalahan teknis di mana artinya masih jelas).

Blrfl
sumber
3

Secara konseptual, slash bukan bagian dari nama. Garis miring hanya pembatas antara nama. Home-dir saya adalah / home / stefan dan bukan / home / stefan /.

Jika Anda tidak mengharapkan garis miring, Anda tidak akan gagal jika ada, seperti yang sudah dicatat amunisi. Tetapi Anda dapat dengan mudah merekatkan nama dan var, karena Anda tidak perlu mengutip slash:

a="/home"
b="stefan"

dir=$a/$b
Pengguna tidak diketahui
sumber
0

Membutuhkan direktori yang tidak harus memiliki trailing slash akan sangat mengganggu untuk penggunaan interaktif di konsol: penyelesaian otomatis dengan TAB secara otomatis menambahkan trailing slash untuk direktori.

Jadi Anda tentu perlu membolehkan direktori ditentukan dengan trailing slash.

oberlies
sumber