bash别名中的多个命令


210

我想定义一个别名,该别名可以连续运行以下两个命令。

gnome-screensaver
gnome-screensaver-command --lock

现在我加了

alias lock='gnome-screensaver-command --lock'

到我的.bashrc,但是由于我经常锁定我的工作站,因此只键入一个命令会更容易。

Answers:


390

尝试:

alias lock='gnome-screensaver; gnome-screensaver-command --lock'

要么

lock() {
    gnome-screensaver
    gnome-screensaver-command --lock
}

在你的.bashrc中

第二种解决方案允许您使用参数。


7
那不应该是“ function lock(){blah}”吗?
emeraldjava

2
您如何通过辩论?在lock()括号内嵌套变量“ msg” 会导致错误syntax error near unexpected token msg'` ..
geotheory 2014年

8
定义函数后,它的行为就像一条命令:参数在命令行上,由空格分隔。在申报环节,论据是$1$2...函数体。
mouviciel 2014年

1
表示不接受带有params的别名行的内容。
菲利普·雷戈

2
@PhilipRego-我很高兴向您学习并赞成您的回答。
mouviciel

79

其他答案可以充分回答问题,但是您的示例看起来像第二条命令取决于第一个命令是否成功退出。您可能想在别名中尝试短路评估

alias lock='gnome-screensaver && gnome-screensaver-command --lock'

现在,除非第一个命令成功执行,否则将不再尝试第二个命令。在SO问题中对短路评估有一个更好的描述。


5
出人意料的是,试图与git fetch && git pull origin master和我,直到我换成没有工作&&;
hakunin 2014年

3
可能是因为git fetch返回的不是0吗?
RobAu 2015年

有帮助!工作对我来说在Xubuntu的16.04.3
费尔南多·莱昂

表示不接受带有params的别名行的内容。
菲利普·雷戈

18

别名用于别名命令名称。除此之外,其他任何事情都应该通过函数来​​完成。

alias ll='ls -l' # The ll command is an alias for ls -l

别名是仍与原始名称关联的名称。 ll只是一种特定的行为ls

d() {
    if exists colordiff; then
        colordiff -ur "$@"
    elif exists diff; then
        diff -ur "$@"
    elif exists comm; then
        comm -3 "$1" "$2"
    fi | less
}

函数是具有内部逻辑的新命令。它不仅仅是简单地重命名另一个命令。它进行内部操作。

从技术上讲,Bash Shell语言中的别名的功能非常有限,以至于它们不适用于涉及多个命令的任何事物。使用它们对单个命令进行小的改动,仅此而已。

由于意图是创建一个新命令来执行内部将在其他命令中解析的操作,因此唯一正确的答案是在此处使用函数:

lock() {
    gnome-screensaver
    gnome-screensaver-command --lock
}

在这种情况下使用别名会遇到很多问题。与作为命令执行的功能相反,别名被扩展为当前命令,这在将该别名“命令”与其他命令结合使用时会导致非常意外的问题。它们也无法在脚本中使用。


最好提供答案的例子。等待更新。
萨吉德·阿里

1
表示不接受带有params的别名行的内容。
菲利普·雷戈

2
@PhilipRego别名不带参数。不要因为苹果不橙而对它投下反对票。改为吃橙子。正如答案很好地解释的那样,正确的工具不是别名而是函数。
lhunath

我的意思是这样的参数。我使用的嵌套引号错误。alias =“ git commit -m'init'; git push; git status”
Philip Rego

@PhilipRego您确实需要使用一个函数,而不是别名。 gps() { git commit -m 'init '; git push; git status; } 如前所述,别名极为有限,易碎,其唯一目的是重命名命令。出于无关的目的滥用它们会使您陷入热水,就像您刚刚经历的那样。
lhunath


4

这将一个接一个地运行这两个命令:

alias lock='gnome-screensaver ; gnome-screensaver-command --lock'

1

因此,请使用分号:

alias lock='gnome-screensaver; gnome-screen-saver-command --lock'

如果您想为第一个命令提供参数,这将无法正常工作。或者,在$ HOME / bin目录中创建一个普通脚本。


0

将我的2美分加到11岁的讨论中,请尝试以下操作:

alias lock="gnome-screensaver \gnome-screensaver-command --lock"


0

将此功能添加到您的设备中,~/.bashrc然后重新启动您的终端或运行source ~/.bashrc

function lock() {
    gnome-screensaver
    gnome-screensaver-command --lock
}

这样,只要您lock在终端中输入,这两个命令就会运行。

在您的特定情况下,创建一个alias可能有效,但我不建议这样做。直观地,我们认为别名的值将与您在终端中输入的值相同。但是事实并非如此:

有关别名的定义和使用的规则有些混乱。

对于几乎所有目的,shell函数优先于别名。

因此,除非必须使用别名,否则不要使用别名。 https://ss64.com/bash/alias.html


-3

将别名声明为时出现问题~/.bashrc。我的终端无法识别我在中声明的别名~/.bashrc。我从文章(位于底部)获悉,Mac OS X login-shell默认运行,因此它调用~/.bash_profile而不是~/.bashrc

如果在声明别名时遇到相同的问题,则可以参考以下链接来解决该问题:

http://www.joshstaiger.org/archives/2005/07/bash_profile_vs.html


这QA是关于一个别名多个命令,而不是在那里把别名。
facuq

source .bashrc在保存对文件的更改之后,我始终会执行操作,以允许在不注销的情况下识别别名。
Scott Fleming
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.