Tolong beritahu saya bagaimana cara mengekspor fungsi di shell induk (bash, sh atau ksh) sehingga fungsi tersebut akan tersedia untuk semua proses anak yang diluncurkan dari proses induk?
Tolong beritahu saya bagaimana cara mengekspor fungsi di shell induk (bash, sh atau ksh) sehingga fungsi tersebut akan tersedia untuk semua proses anak yang diluncurkan dari proses induk?
Jawaban:
The export -f
fitur khusus untuk Bash:
induk
#!/bin/bash
plus1 () { echo $(($1 + 1)); }
echo $(plus1 8)
export -f plus1
./child 14 21
anak
#!/bin/bash
echo $(plus1 $(($1 * $2)) )
Di sh
, tidak mungkin mengekspor fungsi, seperti dicatat oleh Charles Duffy .
Jika Anda menggunakan ksh atau zsh:
Anda dapat menggunakan variabel lingkungan FPATH
, di mana Anda dapat menempatkan semua fungsi Anda.
Jika FPATH
diatur pada interpreter interaktif, dan perintah atau fungsi tidak ditemukan di lingkungan shell saat ini atau PATH
, direktori yang terdaftar di sana mencari keberadaan file yang dinamai setelah perintah yang hilang. Jika ditemukan, itu bersumber di lingkungan shell saat ini, dan diharapkan dapat menentukan fungsinya.
Jadi, Anda dapat menempatkan semua fungsi Anda di satu lokasi FPATH
, dan skrip anak juga akan dapat menemukannya.
Anda dapat menggunakan autoload
perintah dalam skrip shell untuk memuat fungsi yang Anda perlukan:
autoload fun_a fun_b
Dalam zsh, autoload
diperlukan untuk FPATH
bekerja. Dalam ksh
dan kerabat dekatnya, saya percaya itu hanya menyebabkan fungsi yang ditentukan FPATH
untuk menimpa perintah biasa di PATH Anda, seperti yang akan mereka lakukan jika didefinisikan secara langsung.
Beberapa detail FPATH
dan autoload
:
Jika Anda membuat subkulit dengan, ( )
mereka akan mewarisi cuplikan dari semua definisi, parameter, dan variabel shell.
Jika Anda menjalankannya seperti program maka Anda dapat memasukkan definisi .bashrc
.
Jika Anda mencoba untuk memalsukan skrip yang ada untuk menjalankan pembungkus atau substitusi untuk perintah PATH, maka .bashrc
akan berfungsi tergantung pada detail eksekusi. Jika tidak, Anda dapat menjalankan skrip pembungkus yang hanya melakukan .
atau source
dari file include yang mendefinisikan fungsi dan kemudian melakukan hal yang sama dengan skrip shell dengan perintah yang akan diganti.
Skrip pembungkus mungkin terlihat seperti ini:
script=$1
shift
. include.sh
. $script "$@"
Idenya adalah bahwa parameter pertama adalah nama skrip asli dan parameter yang tersisa adalah args, kemudian skrip di atas dijalankan.
declare -x -f NAME
Info lebih lanjut
-f membatasi aksi atau tampilan ke nama fungsi dan definisi -x untuk mengekspor NAMA
bash
. ( ksh
pasangan untuk declare
,, typeset
memiliki -x
opsi, tetapi hanya berlaku untuk variabel , bukan fungsi; ditto untuk zsh
).