2009-04-16 99 views
133

我想定义一个连续运行以下两个命令的别名。bash中的多个命令别名

gnome-screensaver 
gnome-screensaver-command --lock 

现在我已经添加

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

我的.bashrc但因为我锁我的工作站经常它会更容易只需要输入一个命令。

回答

260

尝试:

alias lock='gnome-screensaver; gnome-screensaver-command --lock' 
在你的.bashrc

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

第二个解决方案允许你使用参数。

+5

不应该说是“功能锁定(){}嗒嗒” ? – emeraldjava 2010-01-14 12:12:53

+7

我使用`sh`语法,它也适用于`bash`。 – mouviciel 2010-01-14 13:54:55

+2

你如何通过论证?嵌套在'lock()'括号中的变量'msg'给出错误`语法错误附近的意外令牌msg'` .. – geotheory 2014-03-25 14:57:54

11

这不行吗?

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

这将运行2个命令此起彼伏:

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

因此,使用分号:

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

如果你要提供这个论点不顺利到第一个命令。 或者,在$ HOME/bin目录中创建一个简单的脚本。

9

别名是指别名命令名称。除此之外的任何事情都应该用功能来完成。

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

别名是仍然与原始名称相关联的名称。 ll只是一个稍微特殊的ls

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

函数是一个具有内部逻辑的新命令。这不仅仅是对另一个命令的重命名。它做内部操作。

从技术上讲,Bash shell语言中的别名在功能方面受限制很大,以至于他们极其不适合涉及多于单个命令的任何事情。用它们来做一个单一命令的小变化,仅此而已。

既然目的是创建一个执行它在内部将在其他命令解析操作的新命令,唯一正确的答案是使用此一功能:

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

别名的使用像一个场景这会遇到很多问题。与作为命令执行的函数相反,别名被扩展为当前命令,当将该别名“命令”与其他命令组合时,这会导致非常意外的问题。他们也不能用脚本工作。

56

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

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

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

0

当将别名声明为~/.bashrc时,我遇到了问题。我的终端没有识别我在~/.bashrc中声明的别名。我从文章(附在底部)了解到,默认情况下,Mac OS X运行login-shell,因此它调用~/.bash_profile而不是~/.bashrc

你应该进入中声明你的别名同样的问题,你可以参考下面的链接来解决这个问题:

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