この説明が間違っている場合は訂正してください。 zshスクリプト内で定義されているすべての変数/パラメータは、現在のシェルセッション内でグローバルに持続範囲を維持します。
上記の記述が真であれば、現在のシェルの環境変数/他のzshスクリプトを台無しにすることができます。可能であれば、zshスクリプトのすべての変数/引数を匿名/ローカル内部関数に入れる必要がありますか?
可能性は次のように計算できます。
- ローカルスコープ=>匿名関数の変数をすぐに使用します。
- maker => 組み込み関数を使用して
always
範囲を表示します。always
- 表示するがほとんど使用しないトラップを使用して表示=>トラップ内部機能を使用する
問題と目的は、すべての変数/パラメータがzshスクリプトのローカル変数/パラメータである必要があり、そのzshスクリプトで使用後に削除する必要があることです。
編集:シェルスクリプトを実行して取得するのは本当に混乱しています。
source
スクリプト内のスクリプトが必要ですが、ソーススクリプトの影響を最小限に抑えて、スクリプトが呼び出される環境を妨げようとしています。
@Stéphane Chazelasが質問に答えましたが、理解するように明確に説明して間違っている場合は、修正してください。
シェルスクリプト内でシェルスクリプトを実行すると、./script.zsh
新しいシェルが呼び出され、スクリプトが実行され、呼び出しスクリプトに終了コードが返されます。
シェルスクリプトに入るシェルスクリプトは. ./script.zsh
現在のシェルの子プロセスを作成し、すべての変更(新しい変数、関数定義)を現在のシェルの環境に配置します。これは、ほとんどのユーザーが使用したいと予想される動作です。彼らはプロセスを調達しますが、コメントに記載されている@Stéphane Chazelasなどの匿名機能を使用して、望ましくない部分を除外できます。alias
グローバルスコープは常に表示されます。
答え1
いいえ、スクリプトを実行すると、シェルはスクリプトの内容を解釈するためにスクリプトインタプリタが実行される新しいプロセスを分岐します。
すべての変数割り当てはシェル変数にのみ影響しますそれシェル呼び出しそれプロセス。プロセスが終了すると、呼び出しシェルの変数は影響を受けません。
私が知っている唯一の例外は、fish
シェルを使用してset -U var value
定義することです。fish
汎用変数これは、fish
ある種のIPCメカニズムを使用して実行中のプロセス間で変数値を渡し、fish
実行中のプロセスが存在しない場合に変数値を保持するために永続ストアを使用します。fish
今あなたが源泉スクリプト(代わりに実装するそれ)シェル.
や組み込みコマンドを使うと、次のように言えます。source
あなたのシェルを使用してこのスクリプトのコードを解釈します(ここには子プロセスは含まれていません、. ./script.zsh
同様ですeval "$(<script.zsh)"
)。ただし、通常は次source
の場合にのみ使用します。する変数の割り当てが次のようにシェルに影響することを願っています。購入環境ファイル
これで、好きな場所にスクリプトを取得することを想像できます。変わりやすい、機能、ニックネーム...呼び出しシェルで定義されていますが、一部は補助変数にすぎませんが、そうではありません。その場合は、次のローカルスコープの匿名関数を使用できます。
myfunc() echo hi # function meant to be defined for the invoker
myvar=value # same for a variable
(){ local i # i variable local
for i in foo bar
alias $i='echo x' # alias defined globally
done
}
(zshは関数、エイリアスではなく変数、およびオプションのローカルスコープのみを実装します...)