親の中間のどこかにある別の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
$1
source() { local f=$1; shift; . "$f"; };
.
Bash / ksh / zshでは、/に独自のパラメータを追加できます。source
この場合、そのパラメータのみをソーススクリプトで使用できます。ソース. script.sh foo
スクリプトfoo
はでのみ使用できます$1
。ただし、この方法では空の引数リストを渡すことはできません。その後、他のスクリプトが基本スクリプトの環境を表示したくない場合は、次のようにします。いいえインポートされたコマンドで実行され、スクリプトパラメータstdinとstdoutを介して必要なデータを明示的に渡します。