bash 别名中的多个命令

Posted

技术标签:

【中文标题】bash 别名中的多个命令【英文标题】:Multiple commands in an alias for bash 【发布时间】:2010-10-19 21:31:03 【问题描述】:

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

gnome-screensaver
gnome-screensaver-command --lock

现在我已经添加了

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

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

【问题讨论】:

如果有人需要在 W10 中找到 .bashrc 文件:***.com/a/68745805/7389293 【参考方案1】:
function lock() 
    gnome-screensaver
    gnome-screensaver-command --lock

以上内容在 bash 中对我来说完美翻译为:

bottom() 
    clear
    printf '\n%.0s' 1..100

alias c="bottom"

我想要做的就是清除屏幕 (c alias) 并让 bash 提示出现在底部,而不是终端窗口的顶部。我很久以前就解决了这个问题(很久以前......忘记了我做了什么),但现在我已经把这个函数放在了 .bash_profile 中,它已经开始比赛了!目前,我也在执行该功能,以便在我打开一个新术语时。窗口,提示,并且只有提示,出现在底部。非常感谢您的建议。我不确定我是想念这种东西还是想念得到报酬……可能两者兼而有之。 :-)

【讨论】:

【参考方案2】:

在 Windows 上,Git\etc\bash.bashrc 我使用(在文件末尾)

a()
    git add $1  
    git status

然后在 git bash 中简单地写

$ a Config/

【讨论】:

【参考方案3】:

将此功能添加到您的~/.bashrc 并重新启动您的终端或运行source ~/.bashrc

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

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

在您的特定情况下,创建alias 可能有效,但我不建议这样做。直觉上,我们会认为别名的值与您在终端中输入值的运行方式相同。然而事实并非如此:

关于别名的定义和使用的规则有些 令人困惑。

对于几乎所有用途,shell 函数都优于别名。

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

【讨论】:

【参考方案4】:

将我的 2 美分添加到 11 岁的讨论中试试这个:

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

【讨论】:

【参考方案5】:

别名用于别名命令名称。除此之外的任何事情都应该用函数来完成。

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

在这样的场景中使用别名会遇到很多问题。与作为命令执行的函数相反,别名被扩展为当前命令,当将此别名“命令”与其他命令组合时会导致非常意想不到的问题。它们也不适用于脚本。

【讨论】:

如果您能提供任何示例作为您的答案,那将是最好的。等待更新。 否决不包括带有参数的别名行。 @PhilipRego 别名不带参数。不要因为苹果不是橙色而对苹果投反对票。改为吃一个橙子。正如答案很好解释的那样,这里正确的工具不是别名而是函数。 我的意思是这样的参数。我错误地使用了嵌套引号。 alias="git commit -m 'init '; git push; git status" @PhilipRego 您确实需要使用函数,而不是别名。 gps() git commit -m 'init '; git push; git status; 如前所述,别名极其有限、脆弱,它们的唯一目的是重命名命令。出于不相关的目的滥用它们会让你陷入困境,就像你刚刚经历的那样。【参考方案6】:

其他答案充分回答了这个问题,但您的示例看起来第二个命令取决于第一个命令是否成功退出。您可能想在您的别名中尝试short-circuit evaluation:

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

现在甚至不会尝试第二个命令,除非第一个命令成功。此SO question 中描述了对短路评估的更好描述。

【讨论】:

令人惊讶的是,用git fetch && git pull origin master 尝试过这个并没有为我工作,直到我用; 替换&& 可能是因为 git fetch 返回的不是 0? 帮助!在 Xubuntu 16.04.3 上为我工作 否决不包括参数的别名行。 YMMV 但alias gcm='git checkout master && git pull' 对我有用。 (bash 3.2.57(1)-release @Mac:Catalina),在第一个命令返回 0 的情况下。【参考方案7】:

试试:

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

lock() 
    gnome-screensaver
    gnome-screensaver-command --lock

在你的 .bashrc 中

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

【讨论】:

不应该是 "function lock() blah " 吗? 如何传递参数?在 lock() 括号内嵌套变量“msg”会导致错误 syntax error near unexpected token msg'`.. 一旦定义了函数,它的行为就像一个命令:参数在命令行上,由空格分隔。在声明部分,参数是函数体中的$1$2...。 @PhilipRego - 我很高兴向您学习并支持您的回答。 @PhilipRego 多么迂腐。您知道您可以编辑或提供自己的答案吗?【参考方案8】:

所以使用分号:

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

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

【讨论】:

【参考方案9】:

这将依次运行 2 个命令:

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

【讨论】:

【参考方案10】:

这不行吗?

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

【讨论】:

以上是关于bash 别名中的多个命令的主要内容,如果未能解决你的问题,请参考以下文章

是否有一种简洁的方法可以为同一个扩展定义两个或多个 bash 别名?

如何从 Bash 中的文件调用多个命令行参数?

bash脚本中的大写命令别名?

bash别名中的Git自动完成?

终端iTerm配置别名alias重启后别名未生效问题分析与解决

如何(是否可能)创建运行多个命令的hg命令别名?