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)
programming-practices
user-interface
bash
Rohit Agarwal
sumber
sumber
rsync
berperilaku 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 berbicararsync
).ls -l dir
berperilaku berbedals -l dir/
jikadir
symlink ke direktori.Jawaban:
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.
sumber
dirname
,basename
danreadlink
. Masalah yang sangat umum digunakan${path##*/}
sebagai penggantibasename
, tetapi jika jalur berakhir dengan garis miring yang mengembalikan string kosong, bukan elemen jalur terakhir.rsync
Saya melihat Anda)${STR}$(printf \\$(printf '%03o' $(($(printf '%d' "'${STR:(-1)}")==47?0:47))))
Saya juga mendokumentasikannya dalam inti untuk kejelasan: menambah atau menghapus garis miring dalam bashKarena bash mengabaikan beberapa garis miring, Anda dapat dengan aman berasumsi bahwa pengguna tidak memasukkan garis miring di jalur dan menambahkan garis miring sendiri.
sama seperti
Jadi skrip Anda dapat terlihat seperti itu:
dan Anda tidak perlu khawatir apakah pengguna memasukkan trailing / di jalur atau tidak.
sumber
bash
perilaku, kernel yang melakukannya.Almarhum Jon Postel memiliki beberapa saran hebat di bagian 3.2 dari RFC 760 yang berlaku di sini:
sumber
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:
sumber
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.
sumber