Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何为命令“创建bash别名”;cd~1“;_Bash_Pushd - Fatal编程技术网

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

如何为命令“创建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个目录。 我编写了以下函数来实现这一点

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

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

现在,为了切换到第0个目录,我发出一个命令“cd~0”。 我想创建一个bash别名命令或此命令的函数。 类似于“XYA0”的内容,它将切换到堆栈上的第0个目录。 我编写了以下函数来实现这一点-

xya(){
cd~$1
}

其中,上述函数中的“$1”是传递给函数“xya”的第一个参数

但是,我得到了以下错误-

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


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

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

  • 支架扩张
  • 瓷砖膨胀
  • 参数、变量、算术展开;命令替换(相同阶段,从左到右)
  • 分词
  • 路径名扩展
因此,当您的参数展开时,tilde展开已经完成,并且不会再次进行,如果不执行明确的操作,例如使用
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 alias
cd
到一个小函数包装
pushd
。我不知道还有多少人这么做。当与别名
xya
结合使用时,我认为更直观的做法是替换目录堆栈的顶部,而不是向其添加新条目并更改目录堆栈中条目的索引。明白了。然而,当我看到
cd
wrapped时,更常见的是检查我们是否更改为git存储库,如果是,则查找一些元数据;如果这被默默地忽略,依赖它的提示数据或类似的数据可能会丢失。假设最佳操作过程取决于单个用户的设置。
xya(){
    cd "$(dirs -${1-0} -l)"
}