Відповіді:
Якщо ви хочете виконати кожну команду лише в тому випадку, якщо попередня була успішна, комбінуйте їх за допомогою &&
оператора:
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
якщо ви хочете виконати обидві команди незалежно від їх стану повернення.
У чому полягає корисність єдиного Ampersand? Сьогодні вранці я зробив пускову панель на панелі XFCE (у Manjaro + XFCE), щоб запустити 2 менеджери паролів одночасно:
sh -c "keepassx && password-gorilla"
or
sh -c "keepassx; password-gorilla"
Але це працює не так, як я хочу. IE, перша програма запускається, але друга запускається лише тоді, коли попередня закрита
Однак я виявив, що (лише з однією амперсандою):
sh -c "keepassx & password-gorilla"
і працює так, як я хочу зараз ...
;
, за винятком того, що це ставить comman перед ним у фоновому режимі, тобто оболонка не побачить його вихід.
Ви можете використовувати як наступний код;
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();
}
||
крапку з комою або,&&
якщо ви хочете, щоб наступна команда була виконана лише в тому випадку, коли остання не вдалася. Як і в цьому, і якщо це не вдалося, спробуйте.