Я пытаюсь объединить несколько команд 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
В вашем случае, я думаю, вы хотите первый случай, когда выполнение следующей команды зависит от успеха предыдущей.
Вы также можете поместить все команды в скрипт и выполнить это вместо:
#! /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) &
- выполнит цепочку команд в фоновом режиме, даже если какой-либо шаг завершится неудачей.источник
Вы можете разделить ваши команды, используя точку с запятой:
Это то, что вы имеете в виду?
источник
Чтобы запустить их все одновременно, вы можете использовать ключ трубопровода "|" вот так:
источник
Если вы хотите выполнить все команды, независимо от того, выполняется предыдущая или нет, вы можете использовать точку с запятой (;) для разделения команд.
Если вы хотите выполнить следующую команду, только если предыдущая команда выполнена успешно, вы можете использовать && для разделения команд.
В вашем случае выполнение последовательных команд зависит от предыдущих команд, поэтому используйте второй пример, т. Е. Используйте &&, чтобы присоединиться к командам.
источник
источник
cmd1 || cmd2
разделитель, если вам нужноcmd2
выполнить только еслиcmd1
возвращен ненулевой статус в оболочку, и вы можете использовать,cmd1 ; cmd2
если вы хотите выполнить обе команды независимо от их статуса возврата.Какая польза только от одного амперсанда? Этим утром я сделал панель запуска на панели XFCE (в Manjaro + XFCE) для одновременного запуска 2 менеджеров паролей:
Но это не работает, как я хочу. IE, первое приложение запускается, а второе запускается только при закрытии предыдущего
Однако я обнаружил, что (только с одним амперсандом):
и это работает, как я хочу сейчас ...
источник
;
, за исключением того, что он ставит запятую перед ним в фоновом режиме, то есть оболочка не будет видеть его вывод.Вы можете использовать в качестве следующего кода;
Оно работает...
источник
Я нахожу много ответов на этот вопрос вводящим в заблуждение
Изменено в этом сообщении: https://www.webmasterworld.com/linux/3613813.htm
Следующий код создаст окно bash и работает точно так же, как окно bash. Надеюсь это поможет. Слишком много неправильных / неработающих ответов там ...
источник