zsh提供了一些不错的钩子函数,包括chpwd
用于在用户更改目录后运行函数。
# zsh only
function greet() { echo 'hi'; }
chpwd_functions+=("greet")
cd .. # hi
pushd # hi
popd # hi
我试图在bash中模拟它。
限制条件:
- 它必须在交互式和非交互式shell中都可以工作,我认为这意味着它不能依赖于
$PROMPT_COMMAND
- 它无法重新定义
cd
,因为我希望它可用于更改目录的任何命令(例如pushd
和popd
) - 它必须在用户的命令之后运行,因此
trap "my_function" DEBUG
不起作用,除非我可以在其中以某种方式说“首先运行$BASH_COMMAND
我们被困的设备,然后再执行此操作……”我看到可以避免自动运行$BASH_COMMAND
ifextdebug
启用并且 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中运行命令?
@ jw013此代码旨在进入一个开源项目,在该项目中,维护者已明确列出了不重新定义
—
内森·朗
cd
的原则。
另外-“还有许多其他方法可以更改目录”-我不知道,这是我不希望依赖于明确列出它们的另一个原因。
—
内森·朗
为什么要这样做?您的函数可能会制动许多程序(C,Java,..)。在我使用的脚本中,
—
沃尔特A
MYBIN=$( cd -P -- "$(dirname -- "$(command -v -- "$0")")" && pwd -P )
请不要更改受信任的Unix命令。
@NathanLong 仅适用于我的操作系统。此处的操作系统似乎无关紧要。操作系统重要吗?在您的问题中,关键是外壳,您似乎特别在询问
—
jw013 2014年
bash
,它在所运行的所有操作系统上的工作原理几乎相同。
cd
,pushd
和popd
?有几种其他方法可以更改目录?