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

bash别名:在shell命令中使用参数,bash,shell,alias,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"' 我想知道正确的解决

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

它工作得很好-没有额外的撇号/引号。

我将使用函数做什么:

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

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

我将如何使用函数:

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

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

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

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"; }
my_push() { git push origin "HEAD:refs/for/$1"; }

别名用于替换文本。当你说

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"; }
my_push() { git push origin "HEAD:refs/for/$1"; }

@fredtantini所指的解决方案就是我会做的。@fredtantini这不是重复的。我一开始找到了上面的链接,但没有发现我的尝试有什么问题。正如我所说的,你不能为designORLY的别名设置任何参数吗?我想我可以。看看我在描述python SimpleHTTPServer时添加的示例,它不起作用,原因是您认为它起作用。运行模式foo扩展到cd。。。;python-msimplehttpserver$1运行模式。由于交互式shell没有设置任何位置参数,因此未加引号的$1将消失,留下runschema作为python命令的唯一位置参数。尝试运行set-nonexistantschema之类的程序,然后尝试您的别名。@fredtantini指向的解决方案就是我想要的解决方案。@fredtantini这不是重复的。我一开始找到了上面的链接,但没有发现我的尝试有什么问题。正如我所说的,你不能为designORLY的别名设置任何参数吗?我想我可以。看看我在描述python SimpleHTTPServer时添加的示例,它不起作用,原因是您认为它起作用。运行模式foo扩展到cd。。。;python-msimplehttpserver$1运行模式。由于交互式shell没有设置任何位置参数,因此未加引号的$1将消失,留下runschema作为python命令的唯一位置参数。尝试运行set-nonexistantschema之类的程序,然后尝试使用您的别名。您介意删除单词some并在实际发生时提供信息吗?根据你的描述,我不知道到底出了什么问题。单引号阻止了所有变量的扩展。你介意删除单词some并在实际发生时提供信息吗?根据你的描述,我不知道到底出了什么问题。单引号阻止了所有变量的扩展。好了,现在我知道它是如何工作的了。最重要的是,我知道原因。谢谢你的解释。好的,现在我明白了。最重要的是,我知道原因。谢谢你的解释。