基本的にいくつかの環境変数を設定し、サブシェルを開始し、終了時にいくつかの追加コードをフックとして実行するスクリプトを作成する必要があります。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の両方で)行うことができますか?