スクリプトから$preexec_functionsにアクセスする方法

スクリプトから$preexec_functionsにアクセスする方法

一部のZsh関数をスクリプトとして実行するように変換していますが、そのうちの1つから(たとえば)の値にアクセスする必要があります$preexec_functions。関数ではすべてがうまく機能しますが、スクリプトでは失敗します。

スクリプトからこの値にアクセスできますか?

答え1

コードがインタラクティブシェルの内部データにアクセスしたい場合は、別のプログラム(スクリプト)として実行しないでください。源泉スクリプト。

シェル環境を汚染したくないので、スクリプトとして定義したい場合は、サブシェルで実行できます。使用:

myfunction() (
  ...
)

変える:

myfunction() {
  ...
}

その定義を自分の定義に追加したくないのであれば、その定義を別のファイルに追加し、~/.zshrcyour()からそのファイルをインポートするか、自動ロード可能機能を使用してください。~/.zshrcsource /path/to/that/file

それでもスクリプト/別々のプログラムとして実行するには、その関数の定義とスクリプトに必要なすべての項目を渡す必要があります。良い:

CODE=$(
  typeset -p preexec_functions
  (($#preexec_functions)) && functions $preexec_functions
) your-script

そしてyour-scriptそうでした:

eval "$CODE"

つまり、配列の定義と配列が参照するすべての関数をシェルコードにダンプし、スクリプトがそのコードを同じ配列と関数を宣言すると解釈します。

関連情報