Saya memiliki skrip yang memiliki beberapa fungsi.
Bisakah saya menjalankan salah satu fungsi langsung dari baris perintah?
Sesuatu seperti ini?
myScript.sh func()
Jika skrip hanya mendefinisikan fungsi dan tidak melakukan yang lain, Anda dapat mengeksekusi skrip terlebih dahulu dalam konteks shell saat ini menggunakan perintah source
or .
dan kemudian cukup memanggil fungsinya. Lihat help source
untuk informasi lebih lanjut.
exit
dalam fungsi Anda, itu akan menutup terminal setelah fungsi dijalankan. Apakah ada cara lain untuk menyiasatinya? @SvenMarnachbash
), danexit
hanya akan mengakhiri subkulit, tetapi tidak terminal Anda.Nah, sementara jawaban lain benar - Anda pasti dapat melakukan sesuatu yang lain: jika Anda memiliki akses ke skrip bash, Anda dapat memodifikasinya, dan cukup letakkan di bagian akhir parameter khusus
"$@"
- yang akan diperluas ke argumen baris perintah Anda tentukan, dan karena "sendiri" shell akan mencoba memanggilnya kata demi kata; dan di sini Anda bisa menentukan nama fungsi sebagai argumen pertama. Contoh:Untuk memoles, Anda dapat memverifikasi terlebih dahulu bahwa perintah tersebut ada dan merupakan fungsi:
sumber
"$@"
dalam banyak kasus.$@
tidak aman dalam beberapa kasus.bash test.sh testA testB
?[ ! -z "$1" ]
jika tidak sumber akan memunculkan pernyataan lain dalam beberapaPerintah berikut pertama-tama mendaftarkan fungsi dalam konteks, lalu memanggilnya:
sumber
Singkatnya, tidak.
Anda dapat mengimpor semua fungsi dalam skrip ke lingkungan Anda dengan
source
(help source
untuk detailnya), yang kemudian memungkinkan Anda untuk memanggilnya. Ini juga memiliki efek menjalankan skrip, jadi berhati-hatilah.Tidak ada cara untuk memanggil fungsi dari skrip shell seolah-olah itu adalah pustaka bersama.
sumber
Menggunakan
case
Skrip ini akan menjalankan fungsi fun1 dan fun2 tetapi jika Anda memulainya dengan opsi fun1 atau fun2 itu hanya akan menjalankan fungsi yang diberikan dengan args (jika tersedia) dan keluar. Pemakaian
sumber
Sunting: PERINGATAN - tampaknya ini tidak berfungsi di semua kasus, tetapi berfungsi dengan baik pada banyak skrip publik.
Jika Anda memiliki skrip bash yang disebut "control" dan di dalamnya Anda memiliki fungsi yang disebut "build":
Kemudian Anda dapat menyebutnya seperti ini (dari direktori tempatnya):
Jika ada di dalam folder lain, itu akan membuatnya:
Jika file Anda bernama "control.sh", itu akan membuat fungsi tersebut dapat dipanggil seperti ini:
sumber
. ./control.sh && build
Saya memiliki situasi di mana saya memerlukan fungsi dari skrip bash yang tidak boleh dijalankan sebelumnya (misalnya oleh
source
) dan masalahnya@$
adalah myScript.sh kemudian dijalankan dua kali, tampaknya ... Jadi saya telah mendapatkan ide untuk mengeluarkan fungsinya dengan sed:sed -n "/^func ()/,/^}/p" myScript.sh
Dan untuk mengeksekusinya pada saat saya membutuhkannya, saya memasukkannya ke dalam file dan menggunakan
source
:sed -n "/^func ()/,/^}/p" myScript.sh > func.sh; source func.sh; rm func.sh
sumber
Anda dapat memanggil fungsi dari argumen baris perintah seperti di bawah ini
Setelah fungsi selesai, masukkan $ 1 untuk menerima argumen, misalkan kode di atas disimpan di fun.sh untuk menjalankan fungsi ./fun.sh irfan & ./fun.sh config
sumber
Pos terpecahkan tetapi saya ingin menyebutkan solusi pilihan saya. Yakni, tentukan skrip satu baris generik
eval_func.sh
:Kemudian panggil fungsi apa pun dalam skrip apa pun melalui:
Masalah yang saya hadapi dengan solusi yang diterima adalah ketika mencari skrip berisi fungsi saya dalam skrip lain, argumen yang terakhir akan dievaluasi oleh yang pertama, menyebabkan kesalahan.
sumber