如何为命令“创建bash别名”;cd~1“;
在BASH中,我使用“pushd.”命令将当前目录保存在堆栈上。 在两个不同的目录中发出此命令后,我在堆栈上保存了多个目录,通过发出命令“dirs”可以看到这些目录。 例如,下面给出了当前bash会话中“dirs”命令的输出- 0~/eclipse/src如何为命令“创建bash别名”;cd~1“;,bash,pushd,Bash,Pushd,在BASH中,我使用“pushd.”命令将当前目录保存在堆栈上。 在两个不同的目录中发出此命令后,我在堆栈上保存了多个目录,通过发出命令“dirs”可以看到这些目录。 例如,下面给出了当前bash会话中“dirs”命令的输出- 0~/eclipse/src 1~/eclipse 2~/parboil/src 现在,为了切换到第0个目录,我发出一个命令“cd~0”。 我想创建一个bash别名命令或此命令的函数。 类似于“XYA0”的内容,它将切换到堆栈上的第0个目录。 我编写了以下函数来实现这一点
1~/eclipse
2~/parboil/src 现在,为了切换到第0个目录,我发出一个命令“cd~0”。 我想创建一个bash别名命令或此命令的函数。 类似于“XYA0”的内容,它将切换到堆栈上的第0个目录。 我编写了以下函数来实现这一点- xya(){
cd~$1
} 其中,上述函数中的“$1”是传递给函数“xya”的第一个参数 但是,我得到了以下错误- -bash:cd:~1:没有这样的文件或目录
您能告诉我这里出了什么问题吗?通常,bash解析按以下顺序进行:
- 支架扩张
- 瓷砖膨胀
- 参数、变量、算术展开;命令替换(相同阶段,从左到右)
- 分词
- 路径名扩展
eval
如果您愿意接受它们,请在扩展
$1
完成后,使用eval
强制重新开始解析。如果将非eval
-safe的内容作为参数传递,以下内容将尝试减轻损害:
xya() {
local cmd
printf -v cmd 'cd ~%q' "$1"
eval "$cmd"
}
…或者,不那么谨慎(也就是说,下面相信您的参数是eval
-安全的):
您可以让
dirs
为您打印绝对路径:
xya(){
cd "$(dirs -${1-0} -l)"
}
别名不会有这个问题,因为它们在计算时比函数发生得更早。在用任何东西替换
$1
之前,已经完成了几个扩展阶段。@CharlesDuffy您能为上述问题提供一个可以接受参数的别名命令吗?我尝试使用别名命令-alias xya='cd~',后跟参数“1”,但这会导致切换到主目录,而不是堆栈上的第一个目录。老实说,别名很糟糕,我建议使用带有eval
的函数。这是另一种可怕的方式,但至少是一种可以让你控制的方式。@charlesduff你能举个例子说明如何在上面的问题中使用“eval”吗?我做得更好,我写了一个完整的答案来说明这一点。如果下面没有显示,可能会重新加载页面?我认为eval“\\builtin cd~$((0+$1))”
是安全的,并且避免了cd
是别名或函数时出现问题。我同意;如果将输入域限制为数字,这是安全的。(现有的答案也可以与其他输入一起使用,比如用户名,或者被传递到1/foo
,以更改目录名下的子目录foo
,该目录名是通过扩展~1
)得到的。如果我们的函数本身没有名称cd
,我看不到使用内置的理由;如果用户有覆盖cd
的内容,他们不希望在运行xya
更改目录时也应用其逻辑吗?I aliascd
到一个小函数包装pushd
。我不知道还有多少人这么做。当与别名xya
结合使用时,我认为更直观的做法是替换目录堆栈的顶部,而不是向其添加新条目并更改目录堆栈中条目的索引。明白了。然而,当我看到cd
wrapped时,更常见的是检查我们是否更改为git存储库,如果是,则查找一些元数据;如果这被默默地忽略,依赖它的提示数据或类似的数据可能会丢失。假设最佳操作过程取决于单个用户的设置。
xya(){
cd "$(dirs -${1-0} -l)"
}