我一直在尝试仅显示用作名称的终端类型。例如,如果我使用 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
or this
systemd---kdeinit4---lxterminal---bash---pstree
然后当我添加 sed 命令时,它会提取 kdeinit4 而不是终止符。我可以想到几个场景来提取终端类型,但没有一个场景不包含条件语句来检查特定类型的终端。我遇到的问题是我无法准确预测终端名称前面或后面有多少非或非相关事物,或者它们将是什么,也无法准确预测终端名称将是什么。有人对解决这个问题有什么想法吗?
你可以使用
ps -p "$PPID" -o comm=
Or
ps -p "$PPID" -o fname=
如果您的 shell 没有设置 PPID 变量,您可以使用以下命令获取它
ps -p "$(ps -p "$$" -o ppid= | sed 's|\s\+||')" -o fname=
另一种理论是,与 shell 不属于同一 tty 的当前 shell 的父进程实际上可能是生成虚拟终端的进程,因此我们也可以这样找到它:
#!/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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)