zshは、ユーザーがディレクトリを変更した後に関数を実行するためのものなど、いくつかの素晴らしいフック関数を提供しますchpwd
。
# zsh only
function greet() { echo 'hi'; }
chpwd_functions+=("greet")
cd .. # hi
pushd # hi
popd # hi
私はそれをbashでエミュレートしようとしています。
制約:
- インタラクティブシェルと非インタラクティブシェルの両方で機能する必要があります。つまり、次のようなものに依存することはできません
$PROMPT_COMMAND
cd
ディレクトリを変更する任意のコマンド(例:pushd
およびpopd
)で機能させるため、再定義できません。- これは、実行する必要があります後ので、ユーザーの指示
trap "my_function" DEBUG
私は何とかそこに言うことができない限り、仕事は「最初の実行、ない$BASH_COMMAND
、我々は閉じ込められ、その後もこれを行う...」私はの自動実行を回避できることがわかり$BASH_COMMAND
場合がextdebug
有効になっていますそして、trap関数は1を返しますが、強制したくないと思います。成功した(ただし変更された)コマンドにextdebug
戻るの1
は間違っているようです。
最後の部分-「ユーザーのコマンドの後に実行」-は現在私が困惑しているものです。各コマンドの後に関数を実行できる場合は、前回チェックしてからディレクトリが変更されたかどうかをチェックすることができます。例えば:
function check_pwd() {
# true in a new shell (empty var) or after cd
if [ "$LAST_CHECKED_DIR" != "$PWD" ]; then
my_function
fi
LAST_CHECKED_DIR=$PWD
}
私は正しい軌道に乗っていますか、それとももっと良い方法がありますか?ユーザーがディレクトリを変更した後、bashでコマンドを実行するにはどうすればよいですか?
cd
原則として再定義しないことを具体的にリストしたオープンソースプロジェクトに移行することを目的としています。
MYBIN=$( cd -P -- "$(dirname -- "$(command -v -- "$0")")" && pwd -P )
、信頼できるUnixコマンドを変更しないでください。
bash
です、それはそれが実行されるすべてのオペレーティングシステムでほとんど同じように機能します。
cd
、pushd
とpopd
?ディレクトリを変更する方法は他にいくつありますか?