无限递归别名`cd`

时间:2012-03-26 00:58:40

标签: linux shell unix zsh

我想在我的任何一个终端上录制我最近的cd。我认为这样做的一个好方法是编写一个简单的bash脚本包装cd

#!/bin/bash
cd $1 && echo `pwd` > /tmp/.cwd

由于我希望在我的终端进程中发生cd,我需要使用. bettercd.sh运行脚本,对吗?

我的问题出现了: 如果我将cd替换为此新. bettercd.sh,我的shell也会使用cd扩展脚本内的. bettercd.sh - 无限递归。

有没有办法从不同的名称调用cd但行为相同?换句话说,是否有一些命令行为完全(或非常类似于)cd我可以在我的shell脚本中使用,而不会在我每天使用别名cd时发现差异?

我选择的shell是zsh,如果这在某种程度上是相关的。

感谢您的帮助。

6 个答案:

答案 0 :(得分:6)

由于您使用的是zsh,因此可以使用builtin cd代替cd。这会强制shell使用内置命令,而不是递归调用别名。

标准的bourne shell中不存在

builtin。如果您需要在其他shell中使用它,请尝试使用反斜杠前缀cd:\cd。它可以绕过别名而不是shell函数。

答案 1 :(得分:5)

zsh专门为此类工具提供chpwd_functions挂钩函数。如果定义一个函数将新目录附加到文件并将该函数添加到chpwd_functions数组,则每次更改目录时它都会自动运行例程 - 无论是pushd {{1 }或popd

cd

答案 2 :(得分:2)

在脚本中使用cd调用builtin

#!/bin/bash
builtin cd $1 && echo `pwd` > /tmp/.cwd

答案 3 :(得分:2)

除了已发布的答案(我个人更喜欢@sarnold的答案),您可以使用zsh中chdircd具有相同行为的事实,但不是该类别的别名您可以使用alias定义(它可能是C源代码中的“别名”,我不知道)因此使用它是安全的。

答案 4 :(得分:0)

您可以尝试将unalias cd放在bettercd.sh

的顶部

答案 5 :(得分:0)

我建议使用另一个名称来避免这种情况发生 - 如果其他一些脚本执行CD会怎样 - 如果它使用的是您的版本而不是“正常”,那么可能会对系统产生影响。