Próbuję scalić wiele poleceń systemu Linux w jednym wierszu, aby wykonać operację wdrażania. Na przykład
cd /my_folder
rm *.jar
svn co path to repo
mvn compile package install
źródło
Próbuję scalić wiele poleceń systemu Linux w jednym wierszu, aby wykonać operację wdrażania. Na przykład
cd /my_folder
rm *.jar
svn co path to repo
mvn compile package install
Jeśli chcesz wykonać każde polecenie tylko wtedy, gdy poprzednie się powiodło, połącz je za pomocą &&
operatora:
cd /my_folder && rm *.jar && svn co path to repo && mvn compile package install
Jeśli jedno z poleceń nie powiedzie się, wszystkie pozostałe po nim polecenia nie zostaną wykonane.
Jeśli chcesz wykonać wszystkie polecenia niezależnie od tego, czy poprzednie nie powiodły się, rozdziel je średnikami:
cd /my_folder; rm *.jar; svn co path to repo; mvn compile package install
W twoim przypadku myślę, że chcesz pierwszego przypadku, w którym wykonanie następnego polecenia zależy od powodzenia poprzedniego.
Możesz również umieścić wszystkie polecenia w skrypcie i wykonać je zamiast tego:
#! /bin/sh
cd /my_folder \
&& rm *.jar \
&& svn co path to repo \
&& mvn compile package install
(Ukośniki odwrotne na końcu wiersza służą temu, aby powłoka nie myślała, że następny wiersz jest nowym poleceniem; jeśli pominiesz ukośniki odwrotne, musisz napisać całe polecenie w jednym wierszu).
Zapisz to na przykład w pliku i spraw myscript
, aby był wykonywalny:
chmod +x myscript
Możesz teraz wykonać ten skrypt, podobnie jak inne programy na komputerze. Ale jeśli nie umieścisz go w katalogu wymienionym w PATH
zmiennej środowiskowej (na przykład /usr/local/bin
lub w niektórych dystrybucjach Linuksa ~/bin
), musisz podać ścieżkę do tego skryptu. Jeśli znajduje się w bieżącym katalogu, uruchom go za pomocą:
./myscript
Polecenia w skrypcie działają w taki sam sposób, jak polecenia w pierwszym przykładzie; następne polecenie jest wykonywane tylko wtedy, gdy poprzednie się powiodło. Aby bezwarunkowo wykonać wszystkie polecenia, po prostu wypisz każde polecenie w osobnym wierszu:
#! /bin/sh
cd /my_folder
rm *.jar
svn co path to repo
mvn compile package install
||
zamiast średnika lub&&
jeśli chcesz, aby następna komenda była wykonywana tylko w przypadku niepowodzenia ostatniej. Tak jak w tej próbie, a jeśli się nie powiedzie, spróbuj tego.ls >/dev/null & ; echo $!
Wyzwala błąd.tail -f my.log & && ./myscript
co nie działa ... proszę zasugerować.{ tail -f my.log & } && ./myscript
Jednak pamiętaj, że&&
tutaj jest bezużyteczne, ponieważ pierwsze zadanie działa w tle, a zatem drugie zadanie nie może znać wyniku, ponieważ oba zadania rozpoczną się w tym samym czasie. Więc równie dobrze możesz po prostu napisać:{ tail -f my.log & }; ./myscript
sudo
uprawnień do uruchomienia jednego z poleceń? Czy powinienem umieścićsudo
na początku wszystkie polecenia, czy tylko w jednym, który tego potrzebuje? Jak mogę przekazać hasło do tego polecenia, aby zostało poprawnie wykonane?Znalazłem to używając; oddzielanie poleceń działa tylko na pierwszym planie. np .:
cmd1; cmd2; cmd3 &
- wykona się tylkocmd3
w tle, podczas gdycmd1 && cmd2 && cmd3 &
- wykona cały łańcuch w tle JEŻELI nie będzie żadnych błędów.Aby spełnić warunki bezwarunkowego wykonania, użycie nawiasu rozwiązuje to:
(cmd1; cmd2; cmd3) &
- wykona łańcuch poleceń w tle, nawet jeśli jakikolwiek krok się nie powiedzie.źródło
Możesz rozdzielić swoje polecenia za pomocą średnika:
Czy o to ci chodziło?
źródło
Aby uruchomić je wszystkie naraz, możesz użyć klawisza linii rurociągu „|” tak:
źródło
Jeśli chcesz wykonać wszystkie polecenia, niezależnie od tego, czy poprzednie, czy nie, możesz użyć średnika (;), aby rozdzielić polecenia.
Jeśli chcesz wykonać następne polecenie, tylko jeśli poprzednie polecenie się powiedzie, możesz użyć && do oddzielenia poleceń.
W twoim przypadku wykonywanie kolejnych poleceń wydaje się zależeć od poprzednich poleceń, więc skorzystaj z drugiego przykładu, tj. Użyj &&, aby dołączyć do poleceń.
źródło
źródło
cmd1 || cmd2
separatora, jeśli chceszcmd2
wykonać tylko, jeślicmd1
zwrócisz powłoce niezerowy status, i możesz użyć,cmd1 ; cmd2
jeśli chcesz uruchomić obie komendy bez względu na ich zwracany status.Jaka jest użyteczność tylko jednego Ampersand? Dziś rano uruchomiłem program uruchamiający w panelu XFCE (w Manjaro + XFCE), aby jednocześnie uruchamiać 2 menedżerów haseł:
Ale to nie działa tak, jak chcę. IE, pierwsza aplikacja się uruchamia, ale druga uruchamia się dopiero po zamknięciu poprzedniej
Stwierdziłem jednak, że (tylko z jednym znakiem ampersand):
i działa tak, jak chcę teraz ...
źródło
;
, z tym wyjątkiem, że umieszcza przed nim comman w tle, tzn. Powłoka nie zobaczy swojego wyniku.Możesz użyć jako następującego kodu;
To działa...
źródło
Znajduję wiele odpowiedzi na tego rodzaju pytania wprowadzające w błąd
Zmodyfikowano z tego postu: https://www.webmasterworld.com/linux/3613813.htm
Poniższy kod utworzy okno bash i działa dokładnie jak okno bash. Mam nadzieję że to pomoże. Zbyt wiele błędnych / niedziałających odpowiedzi ...
źródło