3

基本的にいくつかの環境変数を設定し、サブシェルを開始し、終了時にいくつかの追加コードをフックとして実行するスクリプトを作成する必要があります。Bash と ZSH の両方で動作する必要があり、おそらく 2 つの異なるスクリプトを維持する必要があることを認識しています。

必要な理由は、ある種のブートストラップスクリプトを作成するためです。たとえば、2 つの関数を含むBootstrap.shstartという名前のファイルを作成するとexit、スクリプトを実行するstartと と が呼び出され、新しいサブシェルがアクティブになります。サブシェルが終了するとexit、最終的に , が呼び出されます。例えば:

# Bootstrap.sh
start() {
    export CUSTOM_VAR="hello world"
}

exit() {
    echo "byebye"
}

$ bootstrap
$ # 「Bootstrap.sh」を見つけてロードし、「start」関数を呼び出します
(myenv) $ echo $CUSTOM_VAR
hello world
(myenv) $ exit
byebye # これが私の終了フックです
$ # 「通常の」シェルに戻ります

Python のvirtualenvを改善するための提案に基づいて、このスクリプトでフックをテストしています。このファイルでは、trap (a) と TRAPEXIT(b) を使用しようとしましたが、どれも機能しませんでした:

# (a), the "bash way", I think
my_hook() {
    echo "exit hook called"
}
trap my_hook EXIT
exec "${@:-$SHELL}"
# (b), as explained in ZSH documentation
# http://zsh.sourceforge.net/Doc/Release/Functions.html
TRAPEXIT() {
    echo "exit hook called"
}
exec "${@:-$SHELL}"

では、どうすれば(可能であればZSHとBashの両方で)行うことができますか?

4

2 に答える 2

3

ZSH の man ページによると、ZSH はビルトインもサポートしていtrapます。あれは、

trap 'any code here' EXIT

ZSH でも動作し、関数名をコード文字列として使用できます。

exec をラップする必要がある場合、以下は bash と zsh の両方で機能するはずです。

function exec {
    echo "Execcing"
    builtin exec "$@"
}
于 2013-08-14T02:12:25.850 に答える