无限递归别名`cd`

bka*_*ase 1 unix linux shell zsh

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

#!/bin/bash
cd $1 && echo `pwd` > /tmp/.cwd
Run Code Online (Sandbox Code Playgroud)

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

我的问题出现了:如果我cd对这个新的别名. bettercd.sh,我的shell也会cd使用. bettercd.sh- 无限递归扩展脚本内部.

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

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

谢谢你的帮助.

Cel*_*ada 6

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

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


sar*_*old 5

zsh提供chpwd_functions钩子功能专门为这样的工具.如果定义一个函数将新目录附加到文件并将该函数添加到chpwd_functions数组中,则每次更改目录时它都会自动运行例程 - 无论是for pushd popd还是cd:

$ record_pwd() { pwd > /tmp/cwd }
$ chpwd_functions=(record_pwd)   
$ cd /tmp ; cat /tmp/cwd
/tmp
$ cd /etc ; cat /tmp/cwd
/etc
$ 
Run Code Online (Sandbox Code Playgroud)