Otwórz okno terminala i uruchom polecenie, a następnie zamknij okno terminalu, jeśli polecenie zakończyło się powodzeniem?

0

Próbuję napisać skrypt, aby wykonać następujące czynności:

  1. Otwórz okno terminala, które uruchamia długo działające polecenie
  2. (Idealnie) przenieś okno terminala do lewego górnego rogu ekranu za pomocą xdotool
  3. 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_cmdjeśli się long_running_cmdpowiedzie, i wykonaj równoważny, start cmd /k long_running_cmdjeś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, waitaby 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_cmdpowł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?

Caspar
źródło
Czy „wyjście” nie działa? działa z moimi skryptami.
captain_G

Odpowiedzi:

1

WSKAZÓWKA! Możesz zweryfikować kod wyjścia poprzednio wykonanego polecenia:

if [ $? -eq 0 ]
then
  exit 0
fi
Silviu
źródło