Выполнить объединение нескольких команд linux в одной строке

Я пытаюсь объединить несколько команд linux в одной строке для выполнения операции развертывания. Например

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

9 ответов


если вы хотите выполнить каждую команду только в случае успеха предыдущей, объедините их с помощью && оператор:

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

я обнаружил, что использование; для разделения команд работает только на переднем плане. например :

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"

но он не работает как я хочу. Т. е. первое приложение запускается, но второе запускается только тогда, когда предыдущее закрыто: -/

однако я обнаружил, что (только с одним амперсандом):

sh -c "keepassx & password-gorilla"

и он работает так, как я хочу сейчас...


вы можете использовать в качестве следующего кода;

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();
            }