Możesz użyć .exec ./your-script
Emulator terminala, taki jak GNOME Terminal, kończy działanie, gdy początkowy proces w nim działający - zwykle jest to powłoka - kończy działanie.
Jeśli jesteś już w terminalu i jedyną rzeczą, którą chcesz zrobić przed zamknięciem tego terminalu, jest uruchomienie określonego skryptu (lub programu), oznacza to, że nie potrzebujesz już powłoki, która w nim działa. W ten sposób możesz użyć exec
wbudowanej powłoki, aby powłoka zastąpiła się procesem utworzonym przez twoje polecenie.
- W przypadku skryptu jest to kolejny proces powłoki - podobnie jak tworzenie drugiego procesu powłoki po uruchomieniu skryptu bez
exec
.
Składnia jest np .exec command
exec ./your-script
exec
: przykład
Załóżmy na przykład, że mam skrypt powłoki o nazwie count
, oznaczony jako wykonywalny i umieszczony w bieżącym katalogu. Zawiera:
#!/usr/bin/env bash
for i in {5..1}; do echo $i; sleep 1; done
I w terminalu uruchamiam:
exec ./count
Drukuje cyfry 5
, 4
, 3
, 2
i 1
jeden za drugim, a następnie końcowe okno zostanie zamknięte.
Jeśli uruchomisz to z czegoś innego niż pierwszy proces uruchamiany w twoim terminalu - na przykład, jeśli bash
najpierw uruchomiłeś, aby uruchomić inną instancję powłoki - to spowoduje to powrót do powłoki, która utworzyła ten proces, zamiast wychodzenia z terminalu. (To zastrzeżenie dotyczy w równym stopniu exit
metod opartych na bazach danych).
Możesz użyć ../your-script; exit
Jeśli nie chcesz, aby twoja powłoka zastąpiła się nowym procesem (via exec
), możesz nakazać mu pozostanie, ale opuści się natychmiast po zakończeniu nowego procesu.
Aby to zrobić, uruchom polecenie i exit
polecenie, oddzielając je, ;
aby można je było podać w jednym wierszu.
Składnia jest command; exit
np ../your-script; exit
command; exit
vs. command && exit
Możesz zauważyć, że wygląda to podobnie do metody sugerowanej w odpowiedziach kos i heemayl . Różnica polega na tym, że:./your-script && exit
&&
uruchamia drugie polecenie tylko wtedy, gdy pierwsze polecenie zgłosiło, że powiodło się, zwracając kod wyjścia równy zero.
;
uruchamia drugie polecenie niezależnie od tego, czy pierwsze polecenie zgłosiło powodzenie.
Który chcesz zależy od konkretnej sytuacji. Jeśli polecenie nie powiedzie się, czy chcesz, aby powłoka wywołująca (i terminal hostujący) pozostała aktywna? Jeśli tak, użyj &&
; jeśli nie, użyj ;
.
Istnieje również command || exit
, który zamyka powłokę wywołującą tylko w przypadku command
zgłoszenia awarii .