首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我必须使用这个命令两次来执行它呢?

为什么我必须使用这个命令两次来执行它呢?
EN

Unix & Linux用户
提问于 2021-05-14 00:44:32
回答 2查看 628关注 0票数 2

我制作了一个别名alias goto="cd $@ && source ~/.zshrc",它可以工作,但前提是我要执行两次。即使在一个shell中执行了两次之后,如果我想移动到另一个dir,也必须再次执行它两次。那是为什么,我怎么能改变呢?

我需要输入两次goto 。第一次,我仍然处于正常状态,第二次,我到达了我的目的地。我需要源.zshrc,因为我检查了路径:

代码语言:javascript
复制
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的第一个问题,所以请不要太粗暴。

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 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)。

票数 4
EN

Unix & Linux用户

发布于 2021-05-14 12:36:19

马龙的答案有效。我没有创建别名,而是执行了以下功能:

代码语言:javascript
复制
function goto {
    cd $@ && exec $SHELL
}

而且效果很好。我还指出,在每次调用goto之后,采购~/..zshrc所需的时间越来越长。

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/649623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档