我制作了一个别名alias goto="cd $@ && source ~/.zshrc",它可以工作,但前提是我要执行两次。即使在一个shell中执行了两次之后,如果我想移动到另一个dir,也必须再次执行它两次。那是为什么,我怎么能改变呢?
我需要输入两次goto 。第一次,我仍然处于正常状态,第二次,我到达了我的目的地。我需要源.zshrc,因为我检查了路径:
CURRENT=$PWD
AT_HOME=0
AT_ROOT=0
if [ $PWD = $HOME ]; then
AT_HOME=1
elif [ $PWD = / ]; then
AT_ROOT=1
else
cd ../
if [ $PWD = $HOME ]; then
AT_HOME=1
elif [ $PWD = / ]; then
AT_ROOT=1
else
cd ../
if [ $PWD = $HOME ]; then
AT_HOME=1
elif [ $PWD = / ]; then
AT_ROOT=1
fi
fi
fi
cd $CURRENT
if [ $AT_HOME = 0 ]; then
if [ $AT_ROOT = 0 ]; then
ZSH_THEME="prompt-basename"
else
ZSH_THEME="prompt-normal"
fi
else
ZSH_THEME="prompt-normal"
fi它给出了完整的路径(即使是在/usr/lib/jvm/java-13/bin),当我源到~/..zshrc时,它给出了我想要的路径(./java-13/bin)。顺便说一句,用&&代替;也不起作用。
谢谢!
*这是我在stackxchange.com的第一个问题,所以请不要太粗暴。
发布于 2021-05-14 07:38:27
首先,别名不是函数,也不接受参数。相反,别名是简单的替换:当您在命令行上键入goto foo并按Enter键时,shell只需在执行命令行之前用别名的值替换goto。
因此,$@不会扩展到传递给别名的参数。实际上,在本例中,它扩展到传递给shell的arguments或您正在采购的脚本。这就是goto第二次正确工作的原因:您现在在获取.zshrc文件时将目录作为参数传递,当您再次声明别名时,$@将扩展到该参数。
此外,由于您使用的是"双引号",因此当您声明别名时,$@会展开immediately。要查看这种情况,在shell启动后,输入没有参数的alias来查看别名。
如果希望goto能够处理参数,则应将其声明为函数:goto() { cd $@ && ... }
然而,作为一项规则,⚠️⚠️。这可能会导致各种问题,这取决于您的dotfile中的内容。
相反,如果您已经对.zshrc文件进行了更改,并且希望应用这些更改,则应该重新启动终端(通过关闭当前的选项卡/窗口并打开一个新的选项卡/窗口),或者重新启动外壳(输入exec $SHELL)。
发布于 2021-05-14 12:36:19
马龙的答案有效。我没有创建别名,而是执行了以下功能:
function goto {
cd $@ && exec $SHELL
}而且效果很好。我还指出,在每次调用goto之后,采购~/..zshrc所需的时间越来越长。
https://unix.stackexchange.com/questions/649623
复制相似问题