无限递归别名`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,如果这在某种程度上是相关的。

感谢您的帮助。

+1

我删除了'bash'标签,因为如果你使用'zsh'作为你的shell,那么'bash(1)'不会涉及到。但我把它留在你的脚本中,因为这就是你想要工作的东西。 – sarnold 2012-03-26 01:04:04

+1

您不能制作'cd'脚本,因为它只会影响为该脚本分支的shell(而不是调用的父shell)。你需要使用这些功能。 – 2012-03-26 05:34:21

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

builtin在标准bourne shell中不存在。如果你需要这个在其他shell中工作,请尝试用这样的反斜杠加前缀cd:\cd。它可以绕过别名而不是shell函数。

+0

它也适用于zsh。 – 2012-03-26 01:06:28

+0

是的,我在谈论zsh。你的意思是它也适用于bash :-) – Celada 2012-03-26 01:08:56

+0

“如果你需要这个在其他shell中工作”,那么有点含糊。 – 2012-03-26 01:09:51

内,您的脚本调用cdbuiltin

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

它不应该工作,因为你不能使'cd'成为一个脚本(它只会改变分支的shell的目录来运行该脚本,而不是调用的父shell的目录)。 – 2012-03-26 05:46:19

+0

别名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 
$ 
+0

谢谢!这是记录pwd的非常优雅的方式 - 我一定会使用它。 – bkase 2012-03-26 02:11:25

:是否为pushdpopdcd - 如果你定义一个函数来新目录附加到文件和功能添加到chpwd_functions阵列,它会自动地在每次更改目录时运行的程序除了已发布的答案(我个人更喜欢@ sarnold的)之外,您可以使用zsh中的chdircd具有相同的行为,但不是您可以使用alias定义的那种别名(它可能是“别名“在C源代码中,我不知道),因此使用它是安全的。