Apakah mungkin skrip shell bersumber tahu lokasinya? Saya sudah membaca menentukan path ke shell script bersumber tapi jawaban fokus pada bash
dan tcsh
dan gagal jika POSIX shell digunakan. $0
juga bukan solusi dan menghasilkan hasil yang salah .
Suatu solusi tidak harus 100% andal. Tidak mungkin jalur tersebut berisi hard atau symlink.
# sourcing the script should yield the absolute path to the script
. somedir/thescript
# within “thescript”
-> /tmp/foo/bar/somedir
Beberapa latar belakang: Skrip adalah bagian dari aplikasi yang sudah ada yang berisi lusinan binari dalam bin
direktori di lokasi yang diketahui (bervariasi per arsitektur) relatif terhadap skrip bersumber. Untuk menggunakan aplikasi, pengguna sumber skrip yang mendahului bin
direktori ke PATH
, sehingga biner aplikasi dapat dengan mudah dipanggil dalam shell saat ini (shell mana pun yang mungkin).
. /path/to/script
sepertiMARCO_DIR=/path/to; . $MARCO_DIR/script
ataueval "$(/path/to/script)"
? @RahulPatilBASH_SOURCE
jelas khusus untuk bash.Jawaban:
Lokasi skrip bersumber tidak tersedia kecuali jika Anda menggunakan shell yang menawarkan ekstensi ke spesifikasi POSIX. Anda dapat menguji ini dengan cuplikan berikut:
dimana
included.sh
mengandungDi bash, nama skrip bersumber di
$BASH_SOURCE
. Dalam zsh (dalam mode kompatibilitas zsh, bukan dalam mode kompatibilitas sh atau ksh), itu dalam$0
(perhatikan bahwa dalam suatu fungsi,$0
adalah nama fungsi sebagai gantinya). Dalam pdksh dan dash, itu tidak tersedia. Di ksh93, metode ini tidak mengungkapkan solusi, tetapi path lengkap ke skrip yang disertakan tersedia sebagai${.sh.file}
.Jika membutuhkan bash atau ksh93 atau zsh cukup baik, Anda dapat menggunakan potongan ini:
Anda dapat mencoba menebak lokasi skrip dengan melihat file apa yang dibuka oleh shell. Secara eksperimental ini tampaknya berfungsi dengan tanda hubung dan pdksh tetapi tidak dengan bash atau ksh93 yang setidaknya untuk skrip pendek telah menutup file skrip pada saat mereka mulai menjalankannya.
Script mungkin bukan file dengan deskriptor nomor tertinggi jika skrip tersebut bersumber di dalam skrip kompleks yang telah diputar dengan pengalihan. Anda mungkin ingin mengulang-ulang file yang terbuka. Ini tidak dijamin untuk tetap bekerja. Satu-satunya cara yang dapat diandalkan untuk menemukan skrip bersumber adalah dengan menggunakan bash, ksh93 atau zsh.
Jika Anda dapat mengubah antarmuka, maka alih-alih mencari skrip Anda, minta skrip Anda mencetak cuplikan shell untuk diteruskan ke
eval
dalam pemanggil. Inilah yang biasanya dilakukan skrip untuk mengatur variabel lingkungan. Ini memungkinkan skrip Anda ditulis secara independen dari keanehan konfigurasi penelepon dan konfigurasi penelepon.Di penelepon:
eval "`/path/to/setenv`"
sumber
Menambahkan ke jawaban Gilles, Anda MUNGKIN bisa mendapatkan skrip shell (
if $0 = ash
) melalui/proc/$$ interface
. Saya tidak tahu seberapa akurat ini, tetapi/proc/$$/fd/11
sepertinya selalu menunjuk ke skrip ini dengan abu BusyBox.Memberikan ini sebagai jawaban potensial bagi mereka yang menemukan halaman ini (seperti juga saya).
Jawaban terakhir telah dihapus - jadi, klaim saya untuk pekerjaan ini diuji pada 4 platform HW yang berbeda (x86, ARM, XLP, dan powerpc). Semua memberikan jawaban yang sama pada fd / 11. Tautan baca dari
/proc/$$/fd/11
hasil skrip saya.Andy
sumber