Entah apa yang saya tanyakan di sini sangat tidak lazim / tidak konvensional / berisiko, atau keterampilan Google-fu saya tidak cukup ...
Dalam bash
skrip shell, apakah ada cara mudah untuk mengetahui apakah skrip tersebut diperoleh dari skrip shell lain, atau apakah skrip dijalankan dengan sendirinya? Dengan kata lain, apakah mungkin untuk membedakan antara dua perilaku berikut?
# from another shell script
source myScript.sh
# from command prompt, or another shell script
./myScript.sh
Apa yang saya pikirkan lakukan adalah membuat skrip shell yang berisi bash
fungsi yang dapat dibuat tersedia saat bersumber. Ketika skrip ini dijalankan dengan sendirinya, saya ingin skrip ini melakukan operasi tertentu, berdasarkan pada fungsi yang ditentukan juga. Apakah ada semacam variabel lingkungan yang dapat diambil skrip shell ini, misalnya
some_function() {
# ...
}
if [ -z "$IS_SOURCED" ]; then
some_function;
fi
Lebih disukai, saya mencari solusi yang tidak memerlukan skrip penelepon untuk mengatur variabel flag.
sunting : Saya tahu perbedaan antara sumber dan dan menjalankan skrip, apa yang saya coba temukan di sini apakah mungkin untuk mengetahui perbedaan dalam skrip yang sedang digunakan (dalam kedua cara).
sumber
.
perintah sama sekali, tetapi tentang mendeteksi apakah skrip telah bersumber atau berjalan secara normal (yaitu dalam subkulit).Jawaban:
Ya - variabel $ 0 memberikan nama skrip saat dijalankan:
Yang berjalan seperti:
Itu tidak memenuhi menjadi sumber dari shell interaktif, tetapi Anda mendapatkan ide ini (saya harap).
Diperbarui untuk menyertakan BASH_SOURCE - terima kasih hjk
sumber
Menggabungkan jawaban @ DarkHeart dengan variabel lingkungan
BASH_SOURCE
tampaknya melakukan trik:edit Tampaknya menjadi solusi yang lebih sederhana jika saya hanya menghitung jumlah elemen dalam
BASH_SOURCE
array:sumber
Saya baru saja membuat jenis naskah perpustakaan yang sama yang berfungsi seperti BusyBox. Di dalamnya, saya menggunakan fungsi berikut untuk menguji apakah itu bersumber ...
Array FUNCNAME yang dikelola Bash pada dasarnya adalah tumpukan panggilan fungsi.
$FUNCNAME
(atau${FUNCNAME[0]}
) adalah nama fungsi yang sedang dijalankan.${FUNCNAME[1]}
adalah nama fungsi yang memanggilnya, dan sebagainya.Item paling atas adalah nilai khusus untuk skrip itu sendiri. Ini akan berisi ...
Fungsi di atas sebenarnya hanya berfungsi ketika dipanggil pada level skrip (yang saya butuhkan). Akan gagal jika dipanggil dari dalam fungsi lain karena nomor item array akan salah. Untuk membuatnya bekerja di mana saja membutuhkan menemukan bagian atas tumpukan dan menguji nilai itu, yang lebih rumit.
Jika Anda membutuhkannya, Anda bisa mendapatkan nomor item larik "atas tumpukan" dengan ...
${#FUNCNAME[@]}
adalah jumlah item dalam array. Sebagai array berbasis nol, kita kurangi 1 untuk mendapatkan item terakhir #.Tiga fungsi ini digunakan bersama-sama untuk menghasilkan jejak tumpukan fungsi yang mirip dengan Python dan mereka dapat memberi Anda ide yang lebih baik bagaimana semua ini bekerja ...
Perhatikan bahwa FUNCNAME, BASH_SOURCE, dan BASH_LINENO adalah 3 array yang dikelola oleh bash seolah-olah mereka adalah array tiga dimensi.
sumber
Hanya ingin menambahkan bahwa penghitungan array tampaknya tidak dapat diandalkan dan orang mungkin seharusnya tidak berasumsi
source
telah digunakan karena menggunakan titik (.
) juga sangat umum (dan mendahuluisource
kata kunci).Misalnya, untuk
sourced.sh
skrip yang hanya berisiecho $0
:Solusi perbandingan yang disarankan berfungsi lebih baik.
sumber
Salah satu cara yang juga berfungsi saat mencari dari shell interaktif :
The
BASH_LINENO
variabel juga merupakan array dengan semua baris fungsi menelepon dieksekusi di. Ini akan menjadi nol jika Anda memanggil skrip secara langsung, atau bilangan bulat yang sesuai dengan nomor baris.Dokumen variabel BASH_ *
sumber