redneb からの (現在受け入れられている) 回答を拡張しています...
TL;DR 別のスクリプト内で位置引数のないスクリプトをソースする必要がある ? function DoSource() { source test.sh ; } ; DoSource
を試す source test.sh
の代わりに .
source
別のスクリプト内で引数のないスクリプトを実行する
Bash からの抜粋 問題のマニュアルは、位置パラメータがソーススクリプトにどのように割り当てられるかの詳細を示しています。特に、ソース コマンドで引数が指定されていない場合 、呼び出し環境から割り当てられます。
その結果、source
するのが面倒になる可能性があります。 引数を渡さないスクリプト たとえば、redneb の例を test.sh
として使用してみましょう。 :
echo "I was given $# argument(s):"
printf "%s\n" "[email protected]"
別のスクリプト userScript.sh
内で供給 、これは例えばワンライナー:
source test.sh
上記の例を実行する場合:
$ bash userScript.sh a 'b c'
I was given 2 argument(s):
a
b c
test.sh
userScript.sh
を継承 位置引数...これは今私が望んでいるものではありません(もしそうなら、 source test.sh "[email protected]"
を使用できたはずです) ).
ソース コマンドを Bash 関数にカプセル化します。新しい userScript.sh
次のようになります:
function DoSource() { source test.sh ; }
DoSource
レポート:
$ bash userScript.sh a 'b c'
I was given 0 argument(s):
空の引数を指定することに注意してください (source test.sh ''
) は同等ではありません。空の引数が test.sh
に渡されるためです。 .
ソーシング スクリプトもソーシングされることが予想される場合
userScript.sh
の場合 DoSource()
を離れたくないでしょう。 その周り。その場合、簡単な解決策は自己破壊です:
function _userScript_sh_DoSource() { source test.sh ; unset "$FUNCNAME" ; }
_userScript_sh_DoSource
1 回限りの使用 (関数名は、名前の競合の可能性を減らすために選択されています)。または unset _userScript_sh_DoSource
コマンドは _userScript_sh_DoSource
の後に置くことができます はもう必要ありません。
複数の用途に柔軟に対応
DoSource()
のより複雑なバリアント :
function DoSource() { local ScriptName="$1" ; shift ; source "$ScriptName" ; }
DoSource test1.sh
DoSource test1.sh "[email protected]"
DoSource test2.sh
source
の「ドロップイン」代替として使用できます 、唯一の違いは、ソースされるスクリプトに位置引数が指定されていない場合、 source
DoSource
の間、それらを継承します。 none を使用します。ただし、DoSource
に注意してください は関数であるため、source
とは異なる動作をします 他の側面 (例:スタック呼び出し、FUNCNAME
、...).
ファイル test.sh
を作成します 次の内容で:
echo "I was given $# argument(s):"
printf "%s\n" "[email protected]"
次に、インタラクティブ シェル セッションからソースを取得します:
$ source ./test.sh a 'b c'
I was given 2 argument(s):
a
b c
[email protected]
を使用して、通常の bash スクリプトで行うのと同じように引数にアクセスします。 または $1
、 $2
、 $3
など
比較のために、通常のスクリプトとして実行します:
$ bash ./test.sh a 'b c'
I was given 2 argument(s):
a
b c