bash関数を呼び出す方法


28

たぶん私はこれを間違った方法で見ています。しかし、ここで私は私がやろうとしていることをしています。私の仕事のほとんどはJavaで行いますが、Unix(bash)環境に切り替えただけです。私はこれをやっています:

[~/Desktop/bashPlay]% cat myFunc
#!/bin/bash

ls2(){
        echo "Hello World"
}

ls3(){
        echo "Testing"
}

echo "this is a test"   
ls2 # this calls a function

[~/Desktop/bashPlay]% myFunc
this is a test
Hello World

しかし、ファイルには2つの関数があり、それらをコマンドラインから個別に呼び出すことができます。すなわち:myFunc.ls2()またはちょうどls2。関数を.bashrcファイルに追加できることは知っていますが、これらの関数を追加せずに実行できる他の方法はあります.bashrcか?

回答:


25

これを行う1つの方法は、もう少し入力することで、sourceコマンドを使用することです。myFuncから関数を呼び出すには、source myFunc; ls2Hello Worldを使用します。

たとえば、次のようなファイルがありますsay.sh

#!/bin/bash

function talk()
{
        echo "hi!"
}

今、私talk()はコマンドラインからその関数を呼び出したいです:

[john @ awesome〜] $ source say.sh; トーク
こんにちは!

別のbashスクリプトから呼び出すには:

#!/bin/bash
source say.sh
talk

また、それぞれを個別のスクリプトに入れて、PATH変数にあるディレクトリに追加することもできます。

そのため、たとえば、あるスクリプトではhello次のようになります。

#!/bin/bash
echo "Hello World"

PATH内のいずれかのディレクトリに配置し、を実行して表示できますecho $PATH。必要に応じてPATHに別のディレクトリを追加するか、既存のディレクトリを使用できます。そこにファイルをコピーしたら、で実行可能にしchmod +x filenameます。


3
明確にするために、スクリプトまたはシェルの起動ごとに1回だけファイルを取得する必要があります。ソースファイルを再度参照することなく、その後何度でも関数を呼び出すことができます。
追って通知があるまで一時停止します。

5

別のアプローチは、と呼ばれるスクリプトを作成することですfunctions.sh~/binたとえば、ディレクトリに)。

このスクリプトでは、すべての個人的な関数定義を追加します(関数を追加するたびにこのファイルに追加します...)

最後source ~/bin/functions.shに、.bashrcファイルに行を追加するだけです。これにより、コマンドラインからそれらを呼び出すことができ、.bashrcクリーンな状態を保ち、個人的な機能のための特定の場所を確保できます。


5

あなたが私のような人なら、機能で環境を乱雑にしたくないでしょう。また、機能の面で一緒に属する関数のグループもあるため、同じスクリプトファイルにそれらを配置することは理にかなっています。(複数のファイルを持つフォルダーが同じ目的を果たすことができることを知っています)。スクリプト内の特定の関数を呼び出すことができる解決策は次のとおりです。

$ cat functions.sh    
#!/bin/bash

ls2() {
        echo "Hello World"
}

ls3() {
        echo "Testing $*"
}

# the next line calls the function passed as the first parameter to the script.
# the remaining script arguments can be passed to this function.

$1 $2 $3 $4 $5 

$ ./functions.sh ls2    
Hello World   
$ ./functions.sh ls3    
Testing     
$ ./functions.sh ls3 first_arg    
Testing first_arg    
$

source2つの異なるshファイルで同じ名前の2つの関数を処理できるため、これが非常に気に入っています。私は交換することにより、パラメータの任意の数を処理するためにそれを洗練$1 $2 $3 $4 $5してFUNC_CALL=$1; shift; $FUNC_CALL "$@"
チャック・ウィルバー

@ChuckWilbur:なぜフープを飛び越えるのですか?最後の行をに変更するだけ"$@"です。PSあなたのアプローチは実際には間違っています。最後の部分は"$FUNC_CALL" "$@"  (  $FUNC_CALL引用符で囲む必要があります)
スコット

なに"$FUNC_CALL"
ctrl-alt-delor

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.