在BASH中,我使用“ pushd。”命令将当前目录保存在堆栈中。 在几个不同的目录中发出此命令后,我在堆栈上保存了多个目录,通过发出命令“ dirs”可以看到这些目录。 例如,下面是我当前bash会话中“ dirs”命令的输出-
0〜/ eclipse / src
1〜/ eclipse
2〜/ parboil / src
现在,要切换到第0个目录,我发出命令“ cd〜0”。 我想创建一个bash别名命令或该命令的函数。 诸如“ xya 0”之类的东西,它将切换到堆栈上的第0个目录。 我写了以下函数来实现这一目的-
xya(){
cd〜$ 1
}
上面函数中的“ $ 1”是传递给函数“ xya”的第一个参数。
但是,我收到以下错误-
-bash:cd:〜1:没有这样的文件或目录
你能告诉我这里出了什么问题吗?
答案 0 :(得分:3)
通常,bash解析按以下顺序进行:
因此,在您进行参数扩展时,如果不进行明确的操作(例如使用eval
),则波浪号扩展已经完成并且不会再次发生。
如果您know the risks并愿意接受它们,请使用eval
强制解析在$1
的扩展完成后重新开始。如果尝试将不eval
安全的内容作为参数传递,则下面的内容尝试减轻这种损害:
xya() {
local cmd
printf -v cmd 'cd ~%q' "$1"
eval "$cmd"
}
...或者,不太谨慎(也就是说,以下内容相信您的论点是eval
-安全的):
xya() {
eval "cd ~$1"
}
答案 1 :(得分:0)
您可以让dirs
为您打印绝对路径:
xya(){
cd "$(dirs -${1-0} -l)"
}