簡體   English   中英

執行在一行中組合多個 Linux 命令

[英]Execute combine multiple Linux commands in one line

我試圖在一行中合並多個 linux 命令來執行部署操作。 例如

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

如果其中一個命令失敗,則不會執行其后的所有其他命令。

如果要執行所有命令而不管前面的命令是否失敗,請用分號分隔它們:

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 認為下一行是新命令;如果省略反斜杠,則需要將整個命令寫在一行中。)

將其保存到一個文件中,例如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

我發現使用 ; 分隔命令僅適用於前台。 例如:

cmd1; cmd2; cmd3 & cmd1; cmd2; cmd3 & - 只會在后台執行cmd3 ,而cmd1 && cmd2 && cmd3 & - 將在后台執行整個鏈,如果沒有錯誤。

為了滿足無條件執行,使用括號解決了這個問題:

(cmd1; cmd2; cmd3) & - 將在后台執行命令鏈,即使任何步驟失敗。

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

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

如果要執行所有命令,無論前一個是否執行,都可以使用分號(;) 分隔命令。

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

在您的情況下,連續命令的執行似乎取決於前面的命令,因此請使用第二個示例,即使用 && 連接命令。

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

只有一個與號有什么用? 今天早上,我在 XFCE 面板(在 Manjaro+XFCE)中做了一個啟動器來同時啟動 2 個密碼管理器:

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

但它不像我想要的那樣工作。 IE,第一個應用程序啟動,但第二個應用程序僅在前一個應用程序關閉時啟動

但是,我發現(只有一個&符號):

sh -c "keepassx & password-gorilla"

它現在可以像我想要的那樣工作......

  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

您可以使用以下代碼;

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

有用...

我發現這類問題的答案很多誤導

修改自這篇文章: 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();
            }

僅供參考,如果您需要在 if-else 中的一行中運行多個命令,您可以用括號將這些命令分組。 有關更多詳細信息,請參閱此頁面

您可以將分號 ( ; ) 替換為&&|| 取決於你需要什么。 請注意,括號會創建一個子 shell 來執行命令。

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM