gpt4 book ai didi

linux - 使用 sed 和 pstree 显示正在使用的终端类型

转载 作者:太空宇宙 更新时间:2023-11-04 11:20:48 25 4
gpt4 key购买 nike

我一直在尝试显示仅用作名称的终端类型。例如,如果我使用的是 konsole,它将显示 konsole。到目前为止,我一直在使用这个命令。

pstree -A -s $$

输出这个。

systemd---konsole---bash---pstree

我有以下可以从该行提取 konsole

pstree -A -s $$ | sed 's/systemd---//g;s/---.*//g' | head -1

并正确输出 konsole。但是有些人只从 pstree 命令得到的输出可能看起来像这样。

systemd---kdeinit4---terminator---bash---pstree

或者这个

systemd---kdeinit4---lxterminal---bash---pstree

然后当我添加 sed 命令时,它会提取 kdeinit4 而不是终止符。我可以想到几个场景来提取终端类型,但没有一个场景不包含用于检查特定类型终端的条件语句。我遇到的问题是我无法准确预测终端名称前面或后面可能有多少非相关或非相关事物,或者它们将是什么,也无法准确预测终端名称将是什么。有人对此有解决方案吗?

最佳答案

你可以使用

ps -p "$PPID" -o comm=

或者

ps -p "$PPID" -o fname=

如果你的 shell 没有设置 PPID 变量,你可以用

ps -p "$(ps -p "$$" -o ppid= | sed 's|\s\+||')" -o fname=

另一种理论是,当前shell的父进程与shell不属于同一个tty,实际上可能是产生虚拟终端的进程,所以我们也可以这样找到它:

#!/bin/bash

shopt -s extglob

SHELLTTY=$(exec ps -p "$$" -o tty=)
P=$$

while read P < <(exec ps -p "$P" -o ppid=) && [[ $P == +([[:digit:]]) ]]; do
if read T < <(exec ps -p "$P" -o tty=) && [[ $T != "$SHELLTTY" ]]; then
ps -p "$P" -o comm=
break
fi
done

关于linux - 使用 sed 和 pstree 显示正在使用的终端类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18453130/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com