Я пытаюсь объединить несколько команд linux в одной строке для выполнения операции развертывания. Например
cd /my_folder
rm *.jar
svn co path to repo
mvn compile package install
Я пытаюсь объединить несколько команд 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
В вашем случае, я думаю, вам нужен первый случай, когда выполнение следующей команды зависит от успеха предыдущей.
Вы также можете поместить все команды в 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
Я нашел, что использование; для разделения команд работает только на переднем плане. например:
cmd1; cmd2; cmd3 &
- выполняется только cmd3
в фоновом режиме, тогда как
cmd1 && cmd2 && cmd3 &
- выполнит всю цепочку в фоновом режиме, если ошибок нет.
Чтобы обеспечить безусловное выполнение, использование круглых скобок решает следующее:
(cmd1; cmd2; cmd3) &
- выполнит цепочку команд в фоновом режиме, даже если какой-либо шаг завершится с ошибкой.
Вы можете отделить свои команды с помощью двоеточия:
cd /my_folder;rm *.jar;svn co path to repo;mvn compile package install
Это ты имеешь в виду?
Чтобы запустить их все одновременно, вы можете использовать ключ pipeопровода "|" вот так:
$ 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();
}