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

  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 ответ1

1

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

if [ $? -eq 0 ]
then
  exit 0
fi

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .