如何将bash别名定义为多个命令的序列?

时间:2010-01-25 21:09:43

标签: linux macos alias bash

我知道如何在bash中配置别名,但有没有办法为一系列命令配置别名?

即我想要一个命令更改为特定目录,然后运行另一个命令。

另外,有没有办法设置运行“sudo mycommand”的命令,然后输入密码?在MS-DOS时代,我一直在寻找一个.bat文件,但我不确定linux(或者说在这种情况下是Mac OSX)的等价物。

8 个答案:

答案 0 :(得分:69)

要链接一系列命令,请尝试以下操作:

alias x='command1;command2;command3;'

或者你可以这样做:

alias x='command1 && command2 && command3'

&&如果前一个命令返回成功,则只执行后续命令。

另外,如果要以交互方式输入密码,或者与其他类似的程序连接,请查看expect。 (http://expect.nist.gov/

答案 1 :(得分:15)

你提到BAT文件所以你想要的也许就是写一个shell脚本。如果是这样,那么只需逐行输入您想要的命令:

command1
command2

并要求bash执行该文件:

bash myscript.sh

如果您希望能够直接调用脚本而不键入“bash”,则将以下行添加为文件的第一行

#! /bin/bash
command1
command2

然后将文件标记为可执行文件:

chmod 755 myscript.sh

现在您可以像任何其他可执行文件一样运行它:

./myscript.sh

请注意,unix并不真正关心文件扩展名。如果您愿意,可以简单地将文件命名为“myscript”而不使用“.sh”扩展名。这是特别重要的第一线。例如,如果您想用Perl编程语言而不是bash编写脚本,那么第一行将是:

#! /usr/bin/perl

第一行告诉你的shell要调用哪些解释器来执行你的脚本。

此外,如果您现在将脚本复制到$ PATH环境变量中列出的目录之一,那么只需键入文件名就可以从任何地方调用它:

myscript.sh

甚至标签完成也可以。这就是为什么我通常在$ PATH中包含一个〜/ bin目录,以便我可以轻松安装个人脚本。最重要的是,一旦你拥有了许多个人脚本,你可以通过复制你的个人〜/ bin目录轻松地将它们移植到任何新的unix机器上。

答案 2 :(得分:8)

为别名定义这些类型的函数可能比使用别名更容易,如果你想要做的不仅仅是一两个命令,那么事情就更容易理解:

在你的.bashrc

perform_my_command() {
    pushd /some_dir
    my_command "$@"
    popd
}

然后在命令行上你可以做到:

perform_my_command my_parameter my_other_parameter "my quoted parameter"

你可以在一个函数中做任何你喜欢的事情,调用其他函数等等。

您可能需要查看Advanced Bash Scripting Guide以获取深入的知识。

答案 3 :(得分:6)

对于别名,您可以使用:

alias sequence='command1 -args; command2 -args;'

或者如果第二个命令必须仅在第一个命令成功使用时执行:

alias sequence='command1 -args && command2 -args'

答案 4 :(得分:6)

如果逻辑变得更复杂或需要添加参数(尽管bash支持别名参数),最好的选择可能是shell函数而不是别名。

可以在.profile或.bashrc中定义此函数。子shell是为了避免更改工作目录。

function myfunc {
   ( cd /tmp; command )
}

然后从命令提示符

$ myfunc

对于第二个问题,您可以将命令添加到/ etc / sudoers(如果您完全确定自己在做什么)

myuser           ALL = NOPASSWD: \
                    /bin/mycommand 

答案 5 :(得分:3)

在单个别名中使用多个命令,您可以使用其中一个逻辑运算符来组合它们。这是一个切换到目录并在其上执行ls

      alias x="cd /tmp && ls -al"

另一种选择是使用shell函数。这些是sh / zsh / bash命令。我不太了解其他炮弹以确定它们是否有效。

至于sudo的事情,如果你想要(尽管我认为这不是一个好主意),正确的方法是改变/etc/sudoers文件以获得你想要的东西。

答案 6 :(得分:2)

您可以在别名中嵌入函数声明后跟函数,如下所示:

alias my_alias='f() { do_stuff_with "$@" (arguments)" ...; }; f'

这种方法的好处在于,只是单独声明功能,您可以放心,您的功能不会被您采购的其他脚本(或使用{{1} }),可能使用同名的自己的帮助器。

例如,假设您有一个脚本.,您可以调用init-my-workspace.sh. init-my-workspace.sh,其目的是设置或导出一堆环境变量(例如,JAVA_HOME) ,PYTHON_PATH等)。如果你的内部碰巧有一个函数source init-my-workspace.sh,那么你运气不好,因为带有相同shell实例的最新的函数声明获胜。

相反,别名具有单独的命名空间,即使在名称冲突的情况下,也会先查找它们。因此,对于与交互式使用相关的自定义,您应该只使用别名。

最后请注意,将所有别名放在同一个地方(例如my_alias)的做法可以让您轻松发现任何名称冲突。

答案 7 :(得分:1)

你也可以写一个shell函数; "的例子cd"和" ls"组合here