从脚本生成新的终端(任何)窗口

从脚本生成新的终端(任何)窗口

我想运行一个脚本来检测当前终端并在后台使用 shell 命令(例如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

有什么提示吗?

答案1

您的ps命令正在打印父进程的 PID (PPID)。当您运行终端模拟器时,$$(当前进程的 PID)将指向您的 shell 会话,并且其 PPID 将是启动它的终端模拟器。

脚本在自己的环境中运行子壳。这意味着脚本的父进程是启动它的 shell。因此,当您运行命令时,您并不是在执行,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

相关内容