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

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

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

Если одна из команд выходит из строя, все остальные команды, следующие за ней, не будут выполнены.

Если вы хотите выполнить все команды независимо от того, были ли предыдущие сбой или нет, отделите их точкой с запятой:

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

В вашем случае, я думаю, вам нужен первый случай, когда выполнение следующей команды зависит от успеха предыдущей.

Вы также можете поместить все команды в script и выполнить это:

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

(Обратные косые черты в конце строки находятся там, чтобы предотвратить оболочку от мысли, что следующая строка - новая команда; если вы опустите обратную косую черту, вам нужно будет написать всю команду в одной строке.)

Сохраните это в файле, например myscript, и сделайте его выполнимым:

chmod +x myscript

Теперь вы можете выполнить этот script как другие программы на машине. Но если вы не поместите его в каталог, указанный в переменной среды PATH (например, /usr/local/bin или в некоторых дистрибутивах Linux ~/bin), вам нужно указать путь к этому script. Если он находится в текущем каталоге, вы выполните его с помощью:

./myscript

Команды в script работают так же, как команды в первом примере; следующая команда выполняется, только если предыдущая выполнена. Для безусловного выполнения всех команд просто перечислите каждую команду в своей строке:

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

Ответ 2

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

cmd1; cmd2; cmd3 & - выполняется только cmd3 в фоновом режиме, тогда как cmd1 && cmd2 && cmd3 & - выполнит всю цепочку в фоновом режиме, если ошибок нет.

Чтобы обеспечить безусловное выполнение, использование круглых скобок решает следующее:

(cmd1; cmd2; cmd3) & - выполнит цепочку команд в фоновом режиме, даже если какой-либо шаг завершится с ошибкой.

Ответ 3

Вы можете отделить свои команды с помощью двоеточия:

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

Это ты имеешь в виду?

Ответ 4

Чтобы запустить их все одновременно, вы можете использовать ключ pipeопровода "|" вот так:

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

Ответ 5

Если вы хотите выполнить все команды, независимо от того, выполняется ли предыдущий или нет, вы можете использовать точку с запятой (;) для разделения команд.

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

В вашем случае выполнение последовательных команд, по-видимому, зависит от предыдущих команд, поэтому используйте второй пример, например, использовать && & чтобы присоединиться к командам.

Ответ 6

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

Ответ 7

Какая польза только от одного амперсанда? Этим утром я создал панель запуска на панели XFCE (в Manjaro + XFCE) для одновременного запуска 2 менеджеров паролей:

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

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

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

sh -c "keepassx & password-gorilla"

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

Ответ 8

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

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

Это работает...

Ответ 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();
            }