如何为命令“ cd〜1”创建bash别名

时间:2019-10-20 17:25:03

标签: bash pushd

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

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

2 个答案:

答案 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)"
}