【问题标题】:bash alias: using parameters inside shell command [duplicate]bash别名:在shell命令中使用参数[重复]
【发布时间】:2015-01-29 12:20:37
【问题描述】:

我想为一个复杂的 git 命令创建一个别名:

git push origin HEAD:refs/for/BRANCH-NAME

我希望命令 my-alias my-branch 运行 git push origin HEAD:refs/for/my-branch。到目前为止,我已经尝试过:

alias my-push='git push origin HEAD:refs/for/$1'
alias my-push='git push origin HEAD:refs/for/"$1"'

我想知道正确的解决方案解释为什么上面会失败。


我确实有这样的别名:

alias run-schema='cd ~/sources/schema; python -m SimpleHTTPServer $1'

而且效果很好 - 没有多余的撇号/引号。

【问题讨论】:

  • @fredtantini 指出的解决方案是我会做的。
  • @fredtantini 这不是重复的。起初我找到了上面的链接,但我尝试了却找不到问题所在。
  • 正如我在下面所说的 你不能有任何别名参数(按设计)
  • 奥利?我觉得我可以。看看我添加到描述中的示例(python SimpleHTTPServer)。
  • 它不起作用,因为您认为它起作用。 run-schema foo 扩展为 cd ...; python -m SimpleHTTPServer $1 run-schema。由于交互式 shell 没有设置任何位置参数,未加引号的 $1 消失了,留下 run-schema 作为 python 命令的唯一位置参数。尝试运行set -- nonexistantschema 之类的内容,然后尝试使用您的别名。

标签: bash shell alias


【解决方案1】:

我会用函数做什么:

my-push(){ git push origin HEAD:refs/for/"$1"; }

你不能有任何别名参数(根据设计),你需要一个 shell 函数,就像我在这里做的那样。此外,当您在某些变量周围加上单引号时,这些变量将永远不会被计算。

【讨论】:

  • 您介意删除some这个词并在实际发生时提供信息吗?根据您的描述,我不知道具体出了什么问题。
  • 单引号防止所有变量的扩展。
【解决方案2】:

别名进行文本替换。当你说

alias foo='echo $1'

然后打电话

foo baz

替换为

echo $1 baz

$1 扩展为空,实际上你得到echo baz。这也是您的第二个别名的工作方式 - 或不起作用 - 因为 $1 位于末尾,当它扩展为空时,看起来好像它已被替换为它之后的内容。有一些有趣的方法可以解决这个问题。例如,如果你说

alias foo='echo $1'
bar() { foo; }
bar qux

这将执行echo qux

如前所述,您的问题的解决方案是一个函数:

my_push() { git push origin "HEAD:refs/for/$1"; }

【讨论】:

  • 好的,现在我知道它是如何工作的了。而且,最重要的是,我知道为什么。谢谢你的解释。
猜你喜欢
  • 2022-07-26
  • 2019-09-02
  • 1970-01-01
  • 2018-07-05
  • 2016-07-14
  • 1970-01-01
  • 1970-01-01
  • 2012-08-15
  • 1970-01-01
相关资源
最近更新 更多