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