web-dev-qa-db-ja.com

コマンドラインでスクリプトから関数を実行するにはどうすればよいですか?

いくつかの機能を持つスクリプトがあります。

関数の1つをコマンドラインから直接実行できますか?

このようなもの?

myScript.sh func()
99
AAaa

スクリプトが関数のみを定義し、他に何もしない場合、最初にsourceまたは.コマンドを使用して現在のシェルのコンテキスト内でスクリプトを実行し、次に関数を呼び出すことができます。詳細については、help sourceを参照してください。

51
Sven Marnach

さて、他の答えは正しいです-あなたは確かに他のことをすることができます: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
201
sdaau

次のコマンドは、最初に関数をコンテキストに登録してから呼び出します。

. ./myScript.sh && function_name
26
TimonWang

簡単に言えば、いいえ。

source(詳細についてはhelp source)を使用して、スクリプト内のすべての関数を環境にインポートできます。これにより、それらを呼び出すことができます。これにはスクリプトを実行する効果もあるため、注意してください。

共有ライブラリであるかのように、シェルスクリプトから関数を呼び出す方法はありません。

12
Sorpigal

以前に実行してはならない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

1
vchrizz

編集:警告-これはすべての場合に機能するとは限りませんが、多くの公開スクリプトでうまく機能します。

「control」というbashスクリプトがあり、その中に「build」という関数がある場合:

function build() { 
  ... 
}

次に、次のように呼び出すことができます(それが存在するディレクトリから):

./control build

別のフォルダ内にある場合、それはそれを作るでしょう:

another_folder/control build

ファイルが「control.sh」という名前の場合、それに応じて関数は次のように呼び出し可能になります。

./control.sh build
0
Arturas M