43

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

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

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

4

8 回答 8

89

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

alias x='command1;command2;command3;'

或者你可以这样做:

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

&& 使它仅在前一个返回成功时才执行后续命令。

同样对于交互式输入密码,或与类似的其他程序交互,请查看 expect。( http://expect.nist.gov/ )

于 2010-01-25T21:12:57.713 回答
20

您提到了 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 机器上。

于 2010-01-25T21:18:55.687 回答
9

为这些类型的事物定义函数可能比别名更容易,如果您想做的不仅仅是一个或两个命令,则可以使事情更具可读性:

在你的 .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以获得深入的知识。

于 2010-01-25T21:29:47.587 回答
8

对于别名,您可以使用:

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

或者如果第二个命令必须在第一个成功的情况下执行,请使用:

alias sequence='command1 -args && command2 -args'
于 2010-01-25T21:15:03.403 回答
6

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

此函数可以在您的 .profile 或 .bashrc 中定义。subshel​​l 是为了避免更改您的工作目录。

function myfunc {
   ( cd /tmp; command )
}

然后从您的命令提示符

$ myfunc

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

myuser           ALL = NOPASSWD: \
                    /bin/mycommand 
于 2010-01-25T21:39:38.227 回答
5

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

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

另一种选择是使用 shell 函数。这些是 sh/zsh/bash 命令。我对其他贝壳的了解还不够,无法确定它们是否有效。

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

于 2010-01-25T21:17:17.083 回答
3

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

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

与仅声明函数本身相比,这种方法的好处是,您可以放心,您的函数不会被您正在采购(或使用.)的其他脚本覆盖,这些脚本可能会在下面使用它自己的帮助程序同名。

例如,假设您有一个init-my-workspace.sh您正在调用的脚本,. init-my-workspace.sh或者source init-my-workspace.sh其目的是设置或导出一堆环境变量(例如,JAVA_HOME、PYTHON_PATH 等)。如果您碰巧在其中也有一个函数my_alias,那么您就不走运了,因为具有相同 shell 实例的最新函数声明获胜。

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

最后,请注意将所有别名放在同一个位置(例如,~/.bash_aliases)的做法使您能够轻松发现任何名称冲突。

于 2015-10-03T20:45:42.680 回答
1

你也可以写一个shell函数;“cd”和“ls”组合的示例在这里

于 2014-07-08T22:02:49.080 回答