2

在 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: 没有这样的文件或目录

你能告诉我这里出了什么问题吗?

4

2 回答 2

4

通常,bash 解析按以下顺序进行:

  • 大括号展开
  • 波浪扩展
  • 参数、变量、算术扩展;命令替换(相同阶段,从左到右)
  • 分词
  • 路径名扩展

因此,当你的参数被扩展时,波浪号扩展已经完成并且不会再次发生,没有做一些明确的事情,比如使用eval.


如果您知道风险并愿意接受,eval请在扩展完成后使用 强制解析重新开始$1eval如果将不安全的东西作为参数传递,下面会尝试减轻损害:

xya() {
  local cmd
  printf -v cmd 'cd ~%q' "$1"
  eval "$cmd"
}

...或者,不那么谨慎(也就是说,下面相信你的论点是eval安全的):

xya() {
  eval "cd ~$1"
}
于 2019-10-20T17:32:35.673 回答
0

您可以dirs为您打印绝对路径:

xya(){
    cd "$(dirs -${1-0} -l)"
}
于 2019-10-20T18:23:45.517 回答