如何在Bash中为导出设置别名

9

我想设置一个环境变量,可以用来做相对目录链。我尝试以下方式,但无法使其工作。我该怎么做?

alias sroot="export SROOT="$PWD""
alias drumit="cd $SROOT/abc/def/drumit"

如果我输入sroot,它会接受别名,但是当我输入drumit时,它会显示错误信息。
bash: cd: /abc/def/drumit: No such file or directory

看起来当Shell被启动时,它将$SROOT作为.。非常感谢您的帮助。
谢谢。

你是否知道 pushdpopd 内置的命令?你可以从中构建你的别名。 - phs
2个回答

9

在定义别名时,您的$PWD和$SROOT变量被展开,而不是在使用它们时才展开。在定义时,在它们前面加上\以避免展开。

alias sroot="export SROOT="\$PWD""
alias drumit="cd \$SROOT/abc/def/drumit"

顺便说一下,我不明白转义序列如何在这里有帮助。但它确实有用。你能解释一下吗?谢谢。 - Sreeram Ravinoothala
这个解决方案适用于在iTerm2中运行Oh-my-zshell的zsh。 - Dan

2

当您首次设置别名时,它会展开$PWD而不是保留其作为变量形式。尝试使用function,像这样:

$ function sroot {
> export SROOT="$PWD"
> }
$ export -f sroot
$ function drumit {
> cd $SROOT/cron
> }
$ export -f drumit
$ declare -f sroot
sroot()
{ 
    export SROOT="$PWD"
}
$ declare -f drumit
drumit ()
{
    cd $SROOT/abc/def/drumit
}

这是当你像在你的问题中使用别名时所发生的事情(变量扩展):
$ alias sroot="export SROOT="$PWD""
$ alias drumit="cd $SROOT/abc/def/drumit"
$ alias
alias SROOT='/home/jon'
alias drumit='cd /home/jon/abc/def/drumit'
alias sroot='export SROOT=/home/jon'

转义也可以起到作用:
$ alias sroot="export SROOT="\$PWD""
$ alias drumit="cd \$SROOT/abc/def/drumit"
$ alias
alias drumit='cd $SROOT/abc/def/drumit'
alias sroot='export SROOT=$PWD'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接