Откройте окно терминала и выполните команду, затем закройте окно терминала, если команда выполнена успешно?

Я пытаюсь написать скрипт для следующего:

  1. Откройте окно терминала, в котором выполняется длинная команда
  2. (В идеале) переместите окно терминала в верхний левый угол экрана с помощью xdotool
  3. Закрывайте окно терминала только в том случае, если из длительной команды завершена работа с нулевым кодом возврата

Чтобы выразить это в терминах Windows, я бы хотел иметь эквивалент Linux start cmd /c long_running_cmd если long_running_cmd успешно, и сделать эквивалент start cmd /k long_running_cmd если это не удастся.

Пока что у меня есть скрипт, который запускает xterm с помощью данной команды, а затем перемещает окно по желанию:

#!/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

И ~/bin/launcher.sh предназначен для запуска всего, что ему передано в качестве аргумента командной строки:

#!/bin/bash

# execute command line arguments
$@

Но я не смог закрыть окно xterm после long_running_cmd готово.

Я думаю что-то вроде xterm -e ~/bin/launcher.sh "./long_running_cmd && kill $PPID" & может быть то, что я после, так что xterm запускается в фоновом режиме и работает ./long_running_cmd && kill $PPID, Таким образом, оболочка в окне xterm затем выполняет долгосрочную команду, и, если она успешно завершается, родительский процесс оболочки (т. Е. Процесс, владеющий окном xterm) завершается, закрывая, таким образом, окно xterm.

Но это не работает: ничего не происходит, поэтому я подозреваю, что мои цитаты или экранирование неверны, и я не смог это исправить.

Альтернативный подход заключается в том, чтобы получить PID long_running_cmdиспользовать wait дождаться его окончания, а затем убить окно xterm, используя kill $! (поскольку $! относится к последней задаче, запущенной в фоновом режиме, которая будет окном xterm). Но я не могу найти хороший способ получить PID и значение выхода long_running_cmd из оболочки, запущенной в окне xterm, в оболочку, которая запустила окно xterm (если не считать их запись в файл где-нибудь, что, по-видимому, должно быть ненужным?).

Что я делаю не так, или есть более простой способ сделать это?

1 ответ

ПОДСКАЗКА! Вы можете проверить код завершения предыдущей выполненной команды:

if [ $? -eq 0 ]
then
  exit 0
fi
Другие вопросы по тегам