无限递归别名`cd`
我想在我的任何一个终端上记录我最近的cd
。我想了一个好办法做到这一点是写一个简单的bash脚本包cd
:无限递归别名`cd`
#!/bin/bash
cd $1 && echo `pwd` > /tmp/.cwd
因为我想cd
到我的终端的过程中出现,我需要与. bettercd.sh
运行脚本,是否正确?
这里来我的问题: 如果我别名cd
这个新. bettercd.sh
,我的外壳也扩大了cd
与. bettercd.sh
脚本里面 - 无限递归。
有什么方法可以用不同的名称调用cd
但行为相同吗?换句话说,是否有一些命令的行为完全(或非常类似)cd
,我可以在我的shell脚本中使用而不会在日常使用别名cd
时有所不同?
我选择的shell是zsh,如果这在某种程度上是相关的。
感谢您的帮助。
由于您使用的zsh,您可以代替cd
使用builtin cd
。这迫使shell使用内置命令而不是递归调用别名。
builtin
在标准bourne shell中不存在。如果你需要这个在其他shell中工作,请尝试用这样的反斜杠加前缀cd:\cd
。它可以绕过别名而不是shell函数。
它也适用于zsh。 – 2012-03-26 01:06:28
是的,我在谈论zsh。你的意思是它也适用于bash :-) – Celada 2012-03-26 01:08:56
“如果你需要这个在其他shell中工作”,那么有点含糊。 – 2012-03-26 01:09:51
内,您的脚本调用cd
与builtin
:
#!/bin/bash
builtin cd $1 && echo `pwd` > /tmp/.cwd
它不应该工作,因为你不能使'cd'成为一个脚本(它只会改变分支的shell的目录来运行该脚本,而不是调用的父shell的目录)。 – 2012-03-26 05:46:19
别名OP为脚本**源**创建脚本而不是**执行**它。看到上面的问题。 – 2012-03-26 09:47:03
你可以尝试把unalias cd
在顶部您bettercd.sh
我提出一个不同的名称,以避免正是这种情况的发生 - 如果有什么其他一些脚本做了CD - 如果它使用您的版本,而不是“正常“,这可能会对系统产生影响。
zsh
为此类工具专门提供了chpwd_functions
挂钩函数。
$ record_pwd() { pwd > /tmp/cwd }
$ chpwd_functions=(record_pwd)
$ cd /tmp ; cat /tmp/cwd
/tmp
$ cd /etc ; cat /tmp/cwd
/etc
$
谢谢!这是记录pwd的非常优雅的方式 - 我一定会使用它。 – bkase 2012-03-26 02:11:25
:是否为pushd
popd
或cd
- 如果你定义一个函数来新目录附加到文件和功能添加到chpwd_functions
阵列,它会自动地在每次更改目录时运行的程序除了已发布的答案(我个人更喜欢@ sarnold的)之外,您可以使用zsh中的chdir
与cd
具有相同的行为,但不是您可以使用alias
定义的那种别名(它可能是“别名“在C源代码中,我不知道),因此使用它是安全的。
我删除了'bash'标签,因为如果你使用'zsh'作为你的shell,那么'bash(1)'不会涉及到。但我把它留在你的脚本中,因为这就是你想要工作的东西。 – sarnold 2012-03-26 01:04:04
您不能制作'cd'脚本,因为它只会影响为该脚本分支的shell(而不是调用的父shell)。你需要使用这些功能。 – 2012-03-26 05:34:21