一行执行多个Linux命令


329

我试图在一行中合并多个Linux命令以执行部署操作。例如

cd /my_folder
rm *.jar
svn co path to repo
mvn compile package install

Answers:


717

如果仅在上一个命令成功的情况下才执行每个命令,请使用&&运算符将它们组合:

cd /my_folder && rm *.jar && svn co path to repo && mvn compile package install

如果其中一个命令失败,则将不执行其后的所有其他命令。

如果要执行所有命令而不管先前的命令是否失败,请使用分号将它们分开:

cd /my_folder; rm *.jar; svn co path to repo; mvn compile package install

在您的情况下,我认为您希望第一种情况下,下一条命令的执行取决于上一条命令的成功。

您还可以将所有命令放在脚本中,然后执行该脚本:

#! /bin/sh
cd /my_folder \
&& rm *.jar \
&& svn co path to repo \
&& mvn compile package install

(在行末尾使用反斜杠可以防止外壳程序认为下一行是新命令;如果省略了反斜杠,则需要在一行中编写整个命令。)

将其保存到文件,例如myscript,并使其可执行:

chmod +x myscript

现在,您可以像计算机上的其他程序一样执行该脚本。但是,如果您不将其放置在PATH环境变量中列出的目录中(例如/usr/local/bin,或在某些Linux发行版中~/bin),则需要指定该脚本的路径。如果它在当前目录中,则使用以下命令执行它:

./myscript

脚本中的命令与第一个示例中的命令相同。下一条命令仅在上一条命令成功的情况下执行。为了无条件地执行所有命令,只需在每个命令的一行上列出它们:

#! /bin/sh
cd /my_folder
rm *.jar
svn co path to repo
mvn compile package install

38
对于将来的读者:您也可以使用||代替分号,或者&&仅在最后一个失败时才执行下一个命令。如尝试此操作,如果失败,请尝试。
DeVadder 2014年

3
嗯,分号并不总是有效。例如ls >/dev/null & ; echo $!触发错误。
Hi-Angel

1
而如果我想在后台运行第一个命令而在前台运行另一个命令,该怎么办tail -f my.log & && ./myscript
OverrockSTAR

4
@Pareshkumar使用bash可以执行以下操作:{ tail -f my.log & } && ./myscript但是,请注意,&&这里没有用,因为第一个作业在后台运行,因此第二个作业无法知道结果,因为两个作业将同时启动。因此,您最好写:{ tail -f my.log & }; ./myscript
Nikos C.

如果我需要sudo权限来运行其中一个命令怎么办?我应该sudo在所有命令的开头还是仅在需要它的那一行?如何将密码传递给该命令以便正确执行?
Drubio

46

我发现使用; 分隔命令仅在前台起作用。例如:

cmd1; cmd2; cmd3 & -仅cmd3在后台执行,而 cmd1 && cmd2 && cmd3 &-如果没有错误,则将在后台执行整个链。

为了满足无条件执行的需要,使用括号可以解决此问题:

(cmd1; cmd2; cmd3) & -即使任何步骤失败,也会在后台执行命令链。


1
您的示例中的后跟&符号是否有意使用?如果是这样,它是做什么用的?
Technophile 2015年

5
@Technophile将运行后台命令
Oak Chantosa

1
一个简单,简短而直接的答案是,您应该更频繁地使用StackExchange网站Dean。感谢您的输入。
CPHPython

10

您可以使用半冒号分隔命令:

cd /my_folder;rm *.jar;svn co path to repo;mvn compile package install

那是你的意思吗?


3

要一次运行它们,可以使用管道键“ |” 像这样:

$ cd /my_folder | rm *.jar | svn co path to repo | mvn compile package install

1
管道用于将命令的输出提供给下一个命令作为输入。例如:X | Y-> X命令输出将用作Y命令的输入
Arpan Saini

2

如果要执行所有命令,无论是否执行前一个命令,都可以使用分号(;)分隔命令。

cd /my_folder; rm *.jar; svn co path to repo; mvn compile package install

如果仅在上一个命令成功执行后才想执行下一个命令,则可以使用&&分隔命令。

cd /my_folder && rm *.jar && svn co path to repo && mvn compile package install

在您的情况下,连续命令的执行似乎取决于先前的命令,因此请使用第二个示例,即使用&&联接命令。


1
cd /my_folder && rm *.jar && svn co path to repo && mvn compile package install

它与OP脚本不同,请说明:如果aa命令失败,则脚本中止
Gilles Quenot 2012年

4
另外,cmd1 || cmd2如果cmd2只需要在cmd1返回给外壳程序非零状态时执行,就可以使用分隔符;如果cmd1 ; cmd2要运行两个命令而不管它们的返回状态如何,都可以使用分隔符。
维克多·索罗金

@sputnick应该,我只是粘贴它和串联起来&&命令
马克·史蒂文斯

3
@MarkStevens这是一个更好的实现,但不会获得与顺序运行命令相同的结果,我认为这就是sputnick的意思。
andrux 2012年

1

一台“&”号的作用是什么?今天早上,我在XFCE面板(位于Manjaro + XFCE中)中创建了一个启动器,以同时启动2个密码管理器:

sh -c "keepassx && password-gorilla"
or
sh -c "keepassx; password-gorilla"

但这并没有我想要的。IE,第一个应用程序启动,但第二个应用程序仅在前一个应用程序关闭时启动

但是,我发现(只有一个“&”号):

sh -c "keepassx & password-gorilla"

现在就可以了...


1
“&”号与相似;,充当命令终止符,不同之处在于,它会将comman放在后台,即shell看不到它的输出。
Sergiy Kolodyazhnyy

-1

您可以使用以下代码;

cd /my_folder && \
rm *.jar && \
svn co path to repo && \
mvn compile package install

有用...


-1

对于此类问题,我会找到很多答案

从这篇文章修改:https : //www.webmasterworld.com/linux/3613813.htm

以下代码将创建bash窗口,并且与bash窗口完全一样。希望这可以帮助。那里有太多错误/无效的答案...

            Process proc;
            try {
                //create a bash window
                proc = Runtime.getRuntime().exec("/bin/bash");
                if (proc != null) {
                       BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
                       PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(proc.getOutputStream())), true);
                       BufferedReader err = new BufferedReader(new InputStreamReader(
                       proc.getErrorStream()));
                       //input into the bash window
                       out.println("cd /my_folder");
                       out.println("rm *.jar");
                       out.println("svn co path to repo");
                       out.println("mvn compile package install");
                       out.println("exit");
                       String line;
                        System.out.println("----printing output-----");
                          while ((line = in.readLine()) != null) {
                             System.out.println(line);
                          }
                          while((line = err.readLine()) != null) {
                             //read errors
                          }
                          proc.waitFor();
                          in.close();
                          out.close();
                          err.close();
                          proc.destroy();
                }

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
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.