希望の出力

希望の出力

親の中間のどこかにある別のbashscript(親)の中にbashscript(子)があります。実行時に親に渡されたパラメータは子に渡されます。この動作を防ぐにはどうすればよいですか?親の主張が子供たちにも伝わることを望んでいません。

ノート:父 - 息子のたとえ話は、父 - 息子のプロセスに関するものではなく、父 - 息子の前に来ることに関するものです。

また、ソーススクリプトに親スクリプトの環境(渡された引数に加えて)を提供したいと思います。これは、スクリプトパラメータのデフォルト値が異なるためです。以下の例をご覧ください。 親スクリプトはソーススクリプトで定義されたいくつかの関数を使用し、ソーススクリプトは親スクリプトが使用する配列も生成します。また、サブスクリプトを取得した後は、親スクリプトの位置パラメータが必要です。

#!/usr/bin/env bash
# - goal: "Parent"

main() {
    # # Path
    #dScriptP="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")"

    # # Argument
    ParentArgument=${1:-40}
    echo "ParentArgument=${ParentArgument}"
    . Child.sh

}

main "$@"
#!/bin/false
# shellcheck shell=bash
# - goal: "Child"

main() {
    # # Path
    #dScriptP="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")"

    # # Argument
    ChildArgument=${1:-30}
    echo "ChildArgument=${ChildArgument}"
}

main "$@"
$ ./Parent.sh 50
ParentArgument=50
ChildArgument=50

希望の出力

$ ./Parent.sh 50
ParentArgument=50
ChildArgument=30

ベストアンサー1

POSIXの説明.「公共施設」(バッシュsource同義語) 次のようになります。

名前: dot - 現在の環境でコマンドを実行します。
要約: . file
説明:シェルは、現在の環境でファイル内のコマンドを実行する必要があります。

しかも実行環境以下を含むように定義されます。

変数の割り当て(特殊組み込み設定を参照)または[environment]で設定されたシェルパラメータ

「変数の割り当てとして設定」は、シェルの起動時に最初に位置引数(パラメータ)がどのように割り当てられるかと実際には一致しないようですが、「設定」への参照はその項目を含める必要があるsetことを示しているようです。とにかく、私が見つけたすべての殻にはそれらが含まれていました。

したがって、シェルの変更はうまくいかないようですが、いくつかのオプションがあります。

  • パラメータの設定を解除するだけですset --。ただし、デフォルトのシェルでは使用できなくなりました。 Bash / ksh / zshでは最初に配列に保存できますが、args=("$@")もちろん配列はソーススクリプトに表示されます。

  • 関数には独自のパラメータセットがあるので、関数内で./を実行してください。 and thenにsource似ています。しかし、これはソースファイルの名前を 。source() { . "$1"; }source script.sh$1source() { local f=$1; shift; . "$f"; };

  • .Bash / ksh / zshでは、/に独自のパラメータを追加できます。sourceこの場合、そのパラメータのみをソーススクリプトで使用できます。ソース. script.sh fooスクリプトfooはでのみ使用できます$1。ただし、この方法では空の引数リストを渡すことはできません。

  • その後、他のスクリプトが基本スクリプトの環境を表示したくない場合は、次のようにします。いいえインポートされたコマンドで実行され、スクリプトパラメータstdinとstdoutを介して必要なデータを明示的に渡します。

おすすめ記事