Zwykle uruchamiam wiele poleceń z czymś takim:
sleep 2 && sleep 3
lub
sleep 2 ; sleep 3
ale co jeśli chcę uruchomić je oba w tle za pomocą jednego polecenia wiersza poleceń?
sleep 2 & && sleep 3 &
nie działa. I ani nie zastępując &&
przy;
Czy jest na to sposób?
()
aby otoczyć polecenie.Odpowiedzi:
Dokładnie jak chcesz, żeby działały? Jeśli chcesz, aby były uruchamiane w tle i działały sekwencyjnie , możesz zrobić coś takiego:
Jeśli z drugiej strony chcesz, aby działały równolegle w tle, możesz zamiast tego zrobić to:
Te dwie techniki można łączyć, na przykład:
Bash będąc bashem, często istnieje wiele różnych technik wykonania tego samego zadania, chociaż czasami występują między nimi subtelne różnice.
źródło
sleep 2 && sleep 3 &
? Wypróbowałem to w bashu i wydaje się, że działa w ten sam sposób (próbowałem z echem).sleep 2 && echo "foo" && sleep 3 & echo "bar""
?&&
Operator informuje powłokę, aby wykonać polecenie przed nim, i tylko wtedy, który wykonuje polecenia bez jakiegokolwiek błędu powłoka wykonuje kolejną komendę. Różni się to zasadniczo od tego;
, że;
umożliwia wykonanie kolejnego polecenia niezależnie od statusu wyjścia poprzedniego polecenia, chyba że był to błąd krytyczny.&
Mówi powłoce aby wykonać wszystkie polecenia „Connected” poprzedzający go w tle. „Połączony” oznacza tutaj, że polecenie jest częścią potoku (|
) lub operatora logicznego.Of these list operators, ‘&&’ and ‘||’ have equal precedence, followed by ‘;’ and ‘&’, which have equal precedence.
w podręczniku bash.Musisz dodać kilka parenów w swojej ostatniej wersji -
lub to też działa -
źródło
&
, jej kod zakończenia wynosi zawsze zero. Tak więc dwa powyższe przypadki robią to samo (powłoka wykonuje obie strony po kolei asynchronicznie ).aby uruchomić wiele poleceń w tle, musisz dodać
&
koniec każdego polecenia. dawny:(command1 &) && (command2 &) && (command3 &)
źródło
Powyższe odpowiedzi używają nawiasów. Bash może również użyć szelek w podobnym celu:
Zwróć uwagę, że nawiasy klamrowe są bardziej wybredne pod względem składni - wymagana jest spacja po
{
, spacja przed}
i końcowy średnik. W niektórych sytuacjach klamry są bardziej wydajne, ponieważ nie rozwidlają nowej podpowłoki. W tym przypadku nie wiem, czy to ma znaczenie.źródło
{ sleep 2; sleep 3; } &
?To działa:
Możesz także:
źródło
Ja też mam tę samą misję. Spróbuję
(sleep2 ; fg )& sleep3 ; fg
, to działa. A kiedy wstępnie podwoisz ctrl + c, oba procesy można zatrzymać.źródło
Możesz użyć podstawienia polecenia bash w
$(command)
następujący sposób:Zauważ, że stdin i stdout są nadal połączone z procesem nadrzędnym i przekierowanie przynajmniej stdout może być trudne. Alternatywnie możesz połączyć polecenia w jeden wiersz, a następnie przekazać ciąg do
bash
polecenia, aby odrodzić nowy proces, który zajmie się wykonaniem.Jest to szczególnie przydatne w skrypcie bash, gdy musisz uruchomić wiele poleceń w tle.
Te dwie instrukcje powinny być równoważne. Atakujących proces tarło w obu przypadkach do obsługi poleceń (łańcuch poleceń) i tym
&
na koniec odłącza wykonania.Tym razem możesz dodać
&>/dev/null
przed the&
na końcu polecenia, aby przekierować przynajmniej wyjście standardowe i uniknąć wyjścia na standardowe wyjście procesu nadrzędnego. Coś jak:źródło
Jeśli chcesz uruchamiać wiele poleceń sekwencyjnie , istnieje naprawdę prosta metoda, która działa wszędzie: Tworzenie pliku! Zaletą tej metody jest to, że jest czysta i prosta.
Najpierw utwórz plik o nazwie, np
commands.sh
. Następnie umieść tam swoje polecenia. Oto próbka:commands.sh:
OK, teraz jesteśmy na ostatnim etapie. Aby uruchamiać polecenia w tle (sekwencyjnie), po prostu uruchom:
źródło