Variabel $ 0 berisi info jalur skrip.
- Bagaimana saya bisa mengubah info jalur ke jalur absolut? Maksud saya cara memproses ~,., .. atau serupa?
- Bagaimana saya bisa membagi info jalur ke direktori dan nama file?
Saya bisa menggunakan python / perl untuk ini, tapi saya ingin menggunakan bash jika memungkinkan.
Jawaban:
Anda tidak perlu memproses hal-hal seperti
~
, shell melakukannya untuk Anda. Itu sebabnya Anda bisa meneruskan~/filename
ke skrip atau program apa pun dan berhasil - semua program itu tidak menangani~
sendiri, shell Anda mengonversi argumen itu/home/username/filename
dan meneruskannya ke program:Jika Anda memerlukan nama file kanonik (yang tidak termasuk hal-hal seperti
..
), gunakanrealpath
(terima kasih Neil ):Adapun untuk memecah jalur menjadi nama direktori dan nama file, gunakan
dirname
danbasename
:sumber
realpath
lebih baik, tetapireadlink
tampaknya berfungsi ketika saya mencobanya; apakah Anda tahu contoh gagal?cd /tmp; touch foo; ln -s foo bar; cd; readlink /tmp/bar
. Ini kembalifoo
danrealpath
kembali/tmp/foo
, itulah yang Anda inginkan.readlink -f
(note-f
) hampir setara denganrealpath
, dan lebih portabel:readlink -f
di GNU coreutils dan ada pada beberapa sistem lain juga;realpath
dikemas secara terpisah dan mungkin tidak diinstal (mis. hanya 5 paket tidak umum yang bergantung padanya di Ubuntu 10.04 atau Debian lenny).Menggunakan dirname dan nama kecil seperti yang disebutkan oleh Michael harus menjadi cara teraman untuk mendapatkan apa yang Anda inginkan.
Pokoknya jika Anda benar-benar ingin melakukan ini dengan "alat bash saja" Anda bisa menggunakan substitusi parameter:
Contoh ini diambil langsung dari Panduan Script Bash Lanjutan yang patut dilihat.
Penjelasannya cukup sederhana:
Lihatlah polanya seperti regex dan
#
atau##
sebagai semacam modifier yang serakah / tidak serakah.Ini mungkin berguna jika Anda harus melakukan ekstraksi bagian path yang lebih rumit.
sumber
${...##...}
dan berteman daripadadirname
danbasename
bahwa mereka tidak bekerja dalam semua kasus. Misalnya keduanya${0##*/}
dan${0%/*}
perluas sama seperti$0
jika$0
tidak mengandung a/
.${0%/*}
ini bukan alternatif yang baikdirname
. Namun, apa salahnya menggunakan${0##*/}
bukanbasename
?$0
nama direktori dengan trailing/
. Tetapi saya menyesali saran saya, karenadirname
tidak melakukan yang lebih baik.realpath
adalah perintah yang memberi tahu Anda jalan yang sebenarnya (menghapus .. dan tautan simbolik dll.)Ini standar dengan FreeBSD. Menurut diskusi ini juga tersedia untuk Linux:
http://www.unix.com/shell-programming-scripting/89294-geting-real-path.html
Diskusi itu juga menawarkan solusi bash:
sumber