Ответы:
Если вы хотите выполнить каждую команду только в том случае, если предыдущая преуспела, объедините их, используя &&
оператор:
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
ls >/dev/null & ; echo $!
вызывает ошибку.
tail -f my.log & && ./myscript
это не работает .., пожалуйста, предложите.
{ tail -f my.log & } && ./myscript
Однако обратите внимание, что здесь &&
это бесполезно, так как первое задание выполняется в фоновом режиме и, следовательно, второе задание не может знать результат, так как оба задания запускаются одновременно. Так что вы могли бы просто написать:{ tail -f my.log & }; ./myscript
sudo
разрешения для запуска одной из команд? Должен ли я поставить sudo
в начале всех команд или только в той, которая нуждается в этом? Как я могу передать пароль этой команде, чтобы она правильно выполнялась?
Я нашел это используя; для разделения команд работает только на переднем плане. например:
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
cmd1 || cmd2
разделитель, если вам нужно cmd2
выполнить только если cmd1
возвращен ненулевой статус в оболочку, и вы можете использовать, cmd1 ; cmd2
если вы хотите выполнить обе команды независимо от их статуса возврата.
Какая польза только от одного амперсанда? Этим утром я сделал панель запуска на панели XFCE (в Manjaro + XFCE) для одновременного запуска 2 менеджеров паролей:
sh -c "keepassx && password-gorilla"
or
sh -c "keepassx; password-gorilla"
Но это не работает, как я хочу. IE, первое приложение запускается, а второе запускается только при закрытии предыдущего
Однако я обнаружил, что (только с одним амперсандом):
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();
}
||
вместо точки с запятой или,&&
если вы хотите, чтобы следующая команда выполнялась только в случае сбоя последней. Как и в этом, и если это не удается, попробуйте это.