コマンドラインでスクリプトから関数を実行するにはどうすればよいですか?
いくつかの機能を持つスクリプトがあります。
関数の1つをコマンドラインから直接実行できますか?
このようなもの?
myScript.sh func()
スクリプトが関数のみを定義し、他に何もしない場合、最初にsource
または.
コマンドを使用して現在のシェルのコンテキスト内でスクリプトを実行し、次に関数を呼び出すことができます。詳細については、help source
を参照してください。
さて、他の答えは正しいです-あなたは確かに他のことをすることができます: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
次のコマンドは、最初に関数をコンテキストに登録してから呼び出します。
. ./myScript.sh && function_name
簡単に言えば、いいえ。
source
(詳細についてはhelp source
)を使用して、スクリプト内のすべての関数を環境にインポートできます。これにより、それらを呼び出すことができます。これにはスクリプトを実行する効果もあるため、注意してください。
共有ライブラリであるかのように、シェルスクリプトから関数を呼び出す方法はありません。
以前に実行してはならないbashスクリプトの関数が必要な場合(たとえばsource
による)があり、@$
の問題は、myScript.shが2回実行されることです。 sedを使用して関数を取得するというアイデアを思いつきました。
sed -n "/^func ()/,/^}/p" myScript.sh
そして、必要なときに実行するには、ファイルに入れてsource
を使用します。
sed -n "/^func ()/,/^}/p" myScript.sh > func.sh; source func.sh; rm func.sh
編集:警告-これはすべての場合に機能するとは限りませんが、多くの公開スクリプトでうまく機能します。
「control」というbashスクリプトがあり、その中に「build」という関数がある場合:
function build() {
...
}
次に、次のように呼び出すことができます(それが存在するディレクトリから):
./control build
別のフォルダ内にある場合、それはそれを作るでしょう:
another_folder/control build
ファイルが「control.sh」という名前の場合、それに応じて関数は次のように呼び出し可能になります。
./control.sh build