347

我正在尝试将多个 linux 命令合并在一行中以执行部署操作。例如

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

11 回答 11

754

如果您只想在前一个命令成功的情况下执行每个命令,则使用&&运算符将​​它们组合起来:

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

行尾的反斜杠是为了防止 shell 认为下一行是新命令;如果省略反斜杠,则需要将整个命令写在一行中。

与在任何地方使用反斜杠相比,更方便的方法&&是在任何命令失败时指示 shell 退出脚本。您可以使用set带有参数的内置函数来执行此操作-e。有了它,您可以以更自然的方式编写脚本:

#! /bin/sh
set -e

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

脚本中的命令的工作方式与第一个示例中的命令相同;下一个命令仅在前一个命令成功时执行。对于所有命令的无条件执行,只需不要调用set -e

#! /bin/sh

cd /my_folder
rm *.jar
svn co path to repo
mvn compile package install
于 2012-10-25T21:08:15.817 回答
47

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

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

为了满足无条件执行,使用括号解决了这个问题:

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

于 2013-07-15T04:37:13.403 回答
10

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

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

那是你的意思吗?

于 2012-10-25T21:06:16.623 回答
4

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

$ cd /my_folder | rm *.jar | svn co path to repo | mvn compile package install
于 2018-04-19T21:49:27.783 回答
2
cd /my_folder && rm *.jar && svn co path to repo && mvn compile package install
于 2012-10-25T21:05:32.397 回答
1

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

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

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

于 2013-07-14T05:58:46.607 回答
1

只有一个&符号有什么用处?今天早上,我在 XFCE 面板(在 Manjaro+XFCE 中)做了一个启动器来同时启动 2 个密码管理器:

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

但它不像我想要的那样工作。IE,第一个应用程序启动,但第二个应用程序仅在前一个关闭时启动

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

sh -c "keepassx & password-gorilla"

它现在可以按我的意愿工作...

于 2017-05-18T17:59:36.230 回答
0
  1. 利用;
  • 无论第一个命令 cmd1 是否成功运行,始终运行第二个命令 cmd2:
    • $ cd myfolder; ls # no matter cd to myfolder successfully, run ls
  1. 利用&&
  • 只有当第一个命令 cmd1 运行成功时,才运行第二个命令 cmd2:

    • $ cd myfolder && ls # run ls only after cd to myfolder
  1. 利用||
  • 只有当第一个命令cmd1运行失败时,才运行第二个命令cmd2:

    • $ cd myfolder || ls # if failed cd to myfolder, `ls` will run
于 2021-09-28T17:08:00.137 回答
-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();
            }
于 2018-08-28T18:33:45.607 回答
-1

您可以使用以下代码;

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

有用...

于 2018-04-10T13:33:54.657 回答
-1

仅供参考,如果您需要在 if-else 的一行中运行多个命令,您可以用括号将命令分组。有关详细信息,请参阅此页面。

您可以将分号 ( ; )替换为&&|| 取决于你需要什么。请注意,括号会创建一个子 shell 来执行命令。

如果存在名为file_name的文件,则以下命令执行 cmd1、cmd2 和 cmd3 命令;否则,cmd4、cmd5 和 cmd6。

[ -f file_name ] && (cmd1; cmd2; cmd3) || (cmd4; cmd5; cmd6)
于 2021-03-17T03:25:37.480 回答