我想在我的任何一个终端上录制我最近的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,如果这在某种程度上是相关的。
感谢您的帮助。
答案 0 :(得分:6)
由于您使用的是zsh,因此可以使用builtin cd
代替cd
。这会强制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中chdir
与cd
具有相同行为的事实,但不是该类别的别名您可以使用alias
定义(它可能是C源代码中的“别名”,我不知道)因此使用它是安全的。
答案 4 :(得分:0)
您可以尝试将unalias cd
放在bettercd.sh
答案 5 :(得分:0)
我建议使用另一个名称来避免这种情况发生 - 如果其他一些脚本执行CD会怎样 - 如果它使用的是您的版本而不是“正常”,那么可能会对系统产生影响。