Я пытаюсь написать скрипт для следующего:
- Откройте окно терминала, в котором выполняется длинная команда
- (В идеале) переместите окно терминала в верхний левый угол экрана с помощью xdotool
- Закрывайте окно терминала только в том случае, если из длительной команды завершена работа с нулевым кодом возврата
Чтобы выразить это в терминах 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 (если не считать их запись куда-то в файл, который выглядит как это должно быть ненужным?).
Что я делаю не так, или есть более простой способ сделать это?