【问题标题】:Execute combine multiple Linux commands in one line在一行中执行组合多个 Linux 命令
【发布时间】:2012-10-16 03:32:17
【问题描述】:

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

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

【问题讨论】:

    标签: linux command-line


    【解决方案1】:
    cd /my_folder && rm *.jar && svn co path to repo && mvn compile package install
    

    【讨论】:

    • 它和OP脚本不一样,请说明:如果a命令失败,脚本中止
    • 另外,如果你需要cmd2来执行,你可以使用cmd1 || cmd2分隔符,仅当cmd1返回非零状态给shell,如果你想运行你可以使用cmd1 ; cmd2这两个命令都不管它们的返回状态。
    • @sputnick 应该是的,我只是把它粘贴进去并用 && 连接命令
    • @MarkStevens 这是一个更好的实现,但它不会得到与命令按顺序运行相同的结果,我认为这就是 sputnick 的意思。
    【解决方案2】:

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

    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
      

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

      如果要执行所有命令而不管前面的命令是否失败,请用分号分隔:

      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 退出脚本。您可以使用带有 -e 参数的 set 内置函数来执行此操作。有了它,您可以以更自然的方式编写脚本:

      #! /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
      

      【讨论】:

      • 对于未来的读者:如果您只想在最后一个命令失败时执行下一个命令,也可以使用|| 代替分号或&&。就像试试这个,如果失败了,试试那个。
      • 嗯,分号并不总是有效。例如。 ls >/dev/null & ; echo $! 触发错误。
      • 如果我想在后台运行第一个命令并在前台运行另一个命令怎么办..我正在尝试这个tail -f my.log & && ./myscript,它不起作用..请建议。
      • @Pareshkumar 使用 bash,您可以:{ tail -f my.log & } && ./myscript 但是,请注意 && 在这里没有用,因为第一个作业在后台运行,因此第二个作业无法知道结果,因为两个作业将同时开始。所以你不妨写:{ tail -f my.log & }; ./myscript
      • 如果我需要sudo 权限来运行其中一个命令怎么办?我应该把sudo 放在所有命令的开头还是放在需要它的那个?如何将密码传递给该命令以便正确执行?
      【解决方案4】:

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

      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
      

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

      【讨论】:

        【解决方案5】:

        我发现使用 ;分隔命令仅适用于前台。例如:

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

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

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

        【讨论】:

        • 您的示例中的尾随与号 (&) 是故意的吗?如果有,它是干什么用的?
        • @Technophile 运行background command
        • 一个简单、简短和直接的答案,您应该更频繁地使用 StackExchange 网站 Dean。感谢您的意见。
        【解决方案6】:

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

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

        但它不能按我的意愿工作。即,第一个应用程序启动,但第二个应用程序仅在前一个应用程序关闭时启动

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

        sh -c "keepassx & password-gorilla"
        

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

        【讨论】:

        • Ampersand 充当类似于; 的命令终止符,不同之处在于这会将comman 置于后台,即shell 不会看到其输出。
        【解决方案7】:

        可以使用如下代码;

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

        它有效...

        【讨论】:

          【解决方案8】:

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

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

          【讨论】:

          • 管道用于将命令的输出作为输入提供给下一个命令。例如: X | Y --> X 命令输出将作为 Y 命令的输入
          【解决方案9】:

          我发现很多此类问题的答案都具有误导性

          根据这篇文章修改: 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();
                      }
          

          【讨论】:

            【解决方案10】:

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

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

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

            [ -f file_name ] && (cmd1; cmd2; cmd3) || (cmd4; cmd5; cmd6)
            

            【讨论】:

              【解决方案11】:
              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

              【讨论】:

                猜你喜欢
                • 2013-12-26
                • 1970-01-01
                • 2012-08-31
                • 2015-06-11
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2014-04-22
                • 2014-01-25
                相关资源
                最近更新 更多