如何为命令 "cd ~1" 创建 bash 别名

How to create an bash alias for the command "cd ~1"

在BASH中,我使用"pushd . "命令将当前目录保存在堆栈中。 在几个不同的目录中发出此命令后,我在堆栈中保存了多个目录,我可以通过发出命令 "dirs" 查看这些目录。 例如,我当前 bash 会话中 "dirs" 命令的输出如下 -

0 ~/eclipse/src
1 ~/日食
2~/parboil/src

现在,要切换到第 0 个目录,我发出命令 "cd ~0"。 我想为这个命令创建一个 bash 别名命令或一个函数。 像 "xya 0" 这样的东西,它将切换到堆栈上的第 0 个目录。 我写了下面的函数来实现这个 -

xya(){
cd ~$1
}

上面函数中的“$1”是传递给函数"xya"的第一个参数。

但是,我收到以下错误 -

-bash: cd: ~1: 没有那个文件或目录

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

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

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

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


如果你know the risks并且愿意接受,在</code>扩展完成后,使用<code>eval强制从头开始解析。如果不 eval-safe 的东西作为参数传递,下面会尝试减轻损害:

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

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

xya() {
  eval "cd ~"
}

你可以让dirs为你打印绝对路径:

xya(){
    cd "$(dirs -${1-0} -l)"
}