繁体   English   中英

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

[英]How to create an bash alias for the command “cd ~1”

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

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

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

xya(){
光盘〜$ 1
}

其中 function 中的“$1”是传递给 function“xya”的第一个参数。

但是,我收到以下错误 -

-bash: cd: ~1: 没有这样的文件或目录

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

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

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

因此,当您的参数被扩展时,波浪号扩展已经完成并且不会再次发生,而无需执行诸如使用eval之类的明确操作。


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

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

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

xya() {
  eval "cd ~$1"
}

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM