Większość powłok zapewnia funkcje takie jak &&
i ;
do łączenia wykonywania poleceń w określony sposób. Ale co, jeśli polecenie jest już uruchomione, czy nadal mogę w jakiś sposób dodać kolejne polecenie do wykonania w zależności od wyniku pierwszego?
Powiedz, że pobiegłem
$ /bin/myprog
some output...
ale naprawdę chciałem /bin/myprog && /usr/bin/mycleanup
. Nie mogę zabić myprog
i zrestartować wszystkiego, ponieważ straciłoby to zbyt wiele czasu. Mogę Ctrl+ Zto i fg
/ bg
jeśli to konieczne. Czy to pozwala mi połączyć w jedno polecenie?
Najbardziej interesuje mnie bash, ale odpowiedzi na wszystkie popularne powłoki są mile widziane!
%
,%1
i$!
. Ważne jest, aby podać PID, w przeciwnym razie zawsze uruchomi się drugie polecenie.wait
nie zapewni pożądanego rezultatu. Często używa się krótkich formularzy, ponieważ są one mniej podatne na literówki.fg
zwraca kod zakończenia programu, który wznawia. Możesz zatem zawiesić swój program, ^Za następnie użyć go,fg && ...
aby go wznowić.źródło
myprog
po raz drugi powodujefg
zakończenie z kodem wyjścia 20 - który jest niezerowy, więc łańcuchowemycleanup
polecenie nie jest wykonywane.Nie jestem pewien, czy to, o co prosisz, jest możliwe, ale jeśli nadal masz powłokę, z której uruchomiłeś program, zawsze możesz sprawdzić
$?
status wyjścia ostatniego procesu:źródło
wait
polecenie w Bash.Jeśli zadanie znajduje się na pierwszym planie, każde z tych poleceń będzie miało takie samo zachowanie, jak się spodziewasz.
UWAGA: $? będzie zawierać status powrotu uruchomionego programu po jego wyjściu.
To wyraźnie wskazuje, co zrobiłaby powłoka, gdybyś pierwotnie wprowadził polecenie.
Jeśli pierwsze polecenie nie odczytuje
stdin
i działa na pierwszym planie, nowe polecenie można wprowadzić podczas działania pierwszego polecenia. Powłoka odczyta ją i wykona po wykonaniu pierwszego polecenia. Jeśli polecenie będzie działać w tle, jest mało prawdopodobne, że będzie czytaćstdin
.EDYCJA:
WAIT
Można także użyć zadania w tle i użyć polecenia. Należy to zrobić ostrożnie, jeśli w tle uruchomiono także inne zadania. Specyfikacja zadania jest wymagana, abyWAIT
polecenie zwracało status zadania oczekującego.źródło
wait
nie jest idealne. Zaletą IMO jest to, że daje nam wyraźniejszy interfejs API, z którym mamy do czynienia. Wpisywanie większej liczby poleceń w wierszu poleceń po uruchomieniu czegoś wydawało mi się trochę nieprzyzwoite.wait
nadal cierpi z powodu braku bezpośredniego łącza do działającego PID, wrt status powrotu. Wydaje się, że jest to problem bardziej związany z tym, jak Bash implementuje różne rzeczy: stackoverflow.com/questions/356100/… . Może to być tak dobre, jak to możliwe.