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в вашем случае выполнение последовательных команд, по-видимому, зависит от предыдущих команд, поэтому используйте второй пример, т. е. используйте && для присоединения к командам.
какова полезность только одного амперсанда? Сегодня утром я сделал пусковую установку на панели 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(); }
Comments