bash别名:在shell命令中使用参数

时间:2014-12-01 13:19:07

标签: bash shell alias

我想为某个复杂的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'

并且工作正常 - 没有额外的撇号/引号。

2 个答案:

答案 0 :(得分:3)

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

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"; }

答案 1 :(得分:1)

使用函数我会做什么:

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

你不能拥有别名的任何参数(按设计),你需要像我这样的shell函数。此外,当您在某些变量周围放置单引号时,永远不会对变量进行求值。