回答:
スクリプトが関数のみを定義し、他に何もしない場合は、最初にsource
or .
コマンドを使用して現在のシェルのコンテキスト内でスクリプトを実行し、次に関数を呼び出すだけです。詳細についてはhelp source
、を参照してください。
bash
)、exit
ターミナルではなくサブシェルだけを終了します。
まあ、他の答えは正しいですが、確かに何か他のことができます。bashスクリプトにアクセスできる場合は、スクリプトを変更して、特別なパラメーターの最後に配置するだけ"$@"
で、コマンドラインの引数に展開できます。指定すると、「単独」であるため、シェルはそれらを逐語的に呼び出そうとします。ここでは、最初の引数として関数名を指定できます。例:
$ cat test.sh
testA() {
echo "TEST A $1";
}
testB() {
echo "TEST B $2";
}
"$@"
$ bash test.sh
$ bash test.sh testA
TEST A
$ bash test.sh testA arg1 arg2
TEST A arg1
$ bash test.sh testB arg1 arg2
TEST B arg2
磨く場合、最初にコマンドが存在し、関数であることを確認できます。
# Check if the function exists (bash specific)
if declare -f "$1" > /dev/null
then
# call arguments verbatim
"$@"
else
# Show a helpful error
echo "'$1' is not a known function name" >&2
exit 1
fi
"$@"
ほとんどの場合に使用します。$@
場合によっては安全ではありません。
bash test.sh testA testB
か?
[ ! -z "$1" ]
そうでなければソースでラップする必要があります。いくつかのbashバージョンでelseステートメントが発生します
次のコマンドは、最初に関数をコンテキストに登録し、次にそれを呼び出します。
. ./myScript.sh && function_name
使用する case
#!/bin/bash
fun1 () {
echo "run function1"
[[ "$@" ]] && echo "options: $@"
}
fun2 () {
echo "run function2"
[[ "$@" ]] && echo "options: $@"
}
case $1 in
fun1) "$@"; exit;;
fun2) "$@"; exit;;
esac
fun1
fun2
このスクリプトは関数fun1とfun2を実行しますが、オプションfun1またはfun2で開始すると、args(指定されている場合)で指定された関数のみが実行され、終了します。使用法
$ ./test
run function1
run function2
$ ./test fun2 a b c
run function2
options: a b c
編集:警告-これはすべてのケースで機能するわけではないようですが、多くの公開スクリプトでうまく機能します。
「control」というbashスクリプトがあり、その中に「build」という関数がある場合:
function build() {
...
}
次に、(それが存在するディレクトリから)次のように呼び出すことができます:
./control build
別のフォルダ内にある場合は、次のようになります。
another_folder/control build
ファイルが「control.sh」と呼ばれている場合、それに応じて関数は次のように呼び出し可能になります。
./control.sh build
. ./control.sh && build
exit
は、関数で使用すると、関数の実行後にターミナルが閉じることです。これを回避する方法はありますか?@SvenMarnach