Próbuję napisać skrypt, aby wykonać następujące czynności:
- Otwórz okno terminala, które uruchamia długo działające polecenie
- (Idealnie) przenieś okno terminala do lewego górnego rogu ekranu za pomocą xdotool
- Zamknij okno terminala tylko wtedy, gdy długo działające polecenie zostało zakończone z zerowym kodem powrotu
Aby wyrazić to w kategoriach Windows, chciałbym, aby Linux miał odpowiednik, start cmd /c long_running_cmd
jeśli się long_running_cmd
powiedzie, i wykonaj równoważny, start cmd /k long_running_cmd
jeśli się nie powiedzie.
Do tej pory mam skrypt, który uruchamia xterm danym poleceniem, a następnie przesuwa okno zgodnie z potrzebami:
#!/bin/bash
# open a new terminal window in the background with the long running command
xterm -e ~/bin/launcher.sh ./long_running_cmd &
# move the terminal window (requires window process to be in background)
sleep 1
xdotool search --name launcher.sh windowmove 0 0
A ~ / bin / launcher.sh jest przeznaczony do uruchamiania wszystkiego, co jest do niego przekazywane jako argument wiersza poleceń:
#!/bin/bash
# execute command line arguments
$@
Ale nie udało mi się zamknąć okna xterm po zakończeniu long_running_cmd
.
Myślę, że coś takiego xterm -e ~/bin/launcher.sh "./long_running_cmd && kill $PPID" &
może być tym, czego szukam, więc Xterm jest uruchamiany w tle i działa ./long_running_cmd && kill $PPID
. Zatem powłoka w oknie xterm uruchamia następnie długo działającą komendę, a jeśli zakończy się powodzeniem, proces nadrzędny powłoki (tj. Proces będący właścicielem okna xterm) zostaje zabity, zamykając w ten sposób okno xterm.
Ale to nie działa: nic się nie dzieje, więc podejrzewam, że moje cytowanie lub ucieczka jest niepoprawna i nie byłem w stanie tego naprawić.
Alternatywnym podejściem byłoby uzyskanie PID long_running_cmd
, użyj, wait
aby poczekać, aż się skończy, a następnie zabij okno xterm za pomocą kill $!
(ponieważ $!
odnosi się do ostatniego zadania rozpoczętego w tle, które będzie oknem xterm). Ale nie mogę znaleźć dobrego sposobu na uzyskanie wartości PID i wyjścia z long_running_cmd
powłoki działającej w oknie xterm i do powłoki, która uruchomiła okno xterm (bez zapisywania ich gdzieś w pliku, co wydaje się być powinno być niepotrzebne?).
Co robię źle lub czy istnieje łatwiejszy sposób na osiągnięcie tego?
Odpowiedzi:
WSKAZÓWKA! Możesz zweryfikować kod wyjścia poprzednio wykonanego polecenia:
źródło