Dalam skrip saya mendapatkan $0
jalur relatif yang memungkinkan untuk itu. Untuk mengubahnya menjadi absolut, saya telah menemukan solusi ini yang tidak saya mengerti:
abspath=$(cd ${0%/*} && echo $PWD/${0##*/})
Masalah saya adalah keajaiban di dalam ${0%/*}
dan ${0##*/}
. Sepertinya mantan mengekstrak dirname dan yang terakhir mengekstrak nama file, saya hanya tidak mengerti caranya.
readlink -f $0
untuk mendapatkan jalur kanonik.dirname
util berguna di sini.BASH_SOURCE
lebih baik daripada$0
, seperti$0
memberikan perintah yang diketik pengguna, yang mungkin bukan skrip yang sedang dieksekusi.Jawaban:
Definisi:
${string%substring}
menghapus kecocokan terpendek$substring
dari akhir$string
.${string##substring}
menghapus kecocokan terlama$substring
sejak awal$string
.Contoh Anda:
${0%/*}
menghapus semuanya setelah slash terakhir, memberi Anda nama direktori skrip (yang mungkin merupakan jalur relatif).${0##*/}
menghapus semuanya hingga tebasan terakhir, memberi Anda hanya nama skrip.Jadi, perintah ini berubah ke direktori skrip dan menggabungkan direktori kerja saat ini (diberikan oleh
$PWD
) dan nama skrip yang memberi Anda jalur absolut.Untuk melihat apa yang sedang terjadi coba:
sumber
Shawn memiliki solusi yang paling sederhana:
readlink -f $0
. Jika Anda ingin benar-benar yakin menangani nama file yang aneh, Anda dapat menggunakan ini:Dokumentasi
sumber
readlink -fn
khusus untuk Linux, NetBSD dan OpenBSD.Berikut ini cara yang lebih aman dan lebih mudah dibaca untuk melakukan pekerjaan ini:
Catatan:
$0
nama file telanjang tanpa jalur sebelumnya, skrip asli akan gagal tetapi yang diberikan di sini akan berfungsi. (Tidak masalah dengan$0
tetapi bisa di aplikasi lain.)$0
, tetapi bisa di aplikasi lain.)unset
penting jika pengguna Anda mungkin telahCDPATH
mengatur.readlink -f
ataurealpath
, ini akan bekerja pada Unix versi non-Linux (misalnya, Mac OS X).sumber
Jika Anda ingin mempelajari Shell Parameter Expansion, Anda dapat membacanya dari sini , tetapi Ekspansi tidak selalu merupakan pilihan yang baik. Dalam hal ini, hampir setiap sistem seperti Unix memiliki 2 utilitas yang baik:
Yang pertama akan mengekstrak nama file, sedangkan yang kedua akan mengekstrak path, jadi, jika Anda memiliki $ 0, katakan:
Dan Anda akan mendapatkan jalannya.
Bersulang
sumber
Memperkenalkan pwd, bash builtin. Juga ditemukan dalam paket GNU coreutils.
sumber