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

bash alias: using parameters inside shell command

本问题已经有最佳答案,请猛点这里访问。

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

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

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

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

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

我确实有这样的别名:

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

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


别名做文本替换。 当你说

1
alias foo='echo $1'

并打电话

1
foo baz

这被替换为

1
echo $1 baz

$1扩展为空,实际上,echo baz。 这也是你的第二个别名的工作方式 - 或者不起作用 - 因为$1在最后,当它扩展为空时,它看起来好像被它后面的内容所取代。 有很多有趣的方法可以解决这个问题。 例如,如果你说

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

这将执行echo qux

正如前面提到的,问题的解决方案是一个函数:

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


我会用一个函数做什么:

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

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