генерировать новое окно (любое) из сценария

Я хотел бы запустить скрипт, который обнаруживает текущий терминал и генерирует новое окно терминала в фоновом режиме с помощью команды оболочки (например, htop )

Я получаю желаемый результат в командной строке:

 cterminal="$(ps -p $(ps -p $$ -o ppid=) o args=)" $(echo $cterminal -e "htop")& 

и работает на всех терминалах. Но не из сценария:

 #!/bin/bash cterminal="$(ps -p $(ps -p $$ -o ppid=) o args=)" echo $cterminal "$cterminal" -e "htop" & 

текущий выход скрипта:

 $ bash script.sh /bin/bash $ /usr/bin/htop: /usr/bin/htop: cannot execute binary file 

Любые намеки?

Ваша команда ps печатает PID родительского процесса (PPID). Когда вы используете эмулятор терминала, $$ (текущий идентификатор процесса) будет указывать на ваш сеанс оболочки, а его PPID будет эмулятором терминала, который запустил его.

Скрипты запускаются в их собственных подоболочках . Это означает, что родительский процесс скрипта – это оболочка, которая запустила его. Итак, когда вы запускаете свою команду, вы не выполняете xterm -e htop но bash xterm -e htop . Проиллюстрировать:

 $ bash top /sbin/top: /sbin/top: cannot execute binary file 

Вы можете проверить это, выполнив echo $(echo $cterminal -e "htop") из сценария и из командной строки.

Чтобы запустить сценарий из эмулятора терминала GUI, вместо этого вы можете использовать PPID PPID:

 cterminal="$(ps -p $(ps -p $PPID -o ppid=) o args=)" 

Наконец, не используйте $(echo ...) для запуска вашей команды, просто запустите ее:

 #!/usr/bin/env bash $(ps -p $(ps -p $PPID -o ppid=) o args=) -e top