首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用sed和pstree显示所使用终端的类型。

使用sed和pstree显示所使用终端的类型。
EN

Stack Overflow用户
提问于 2013-08-26 21:14:50
回答 4查看 660关注 0票数 0

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

代码语言:javascript
复制
pstree -A -s $$

输出这个。

代码语言:javascript
复制
systemd---konsole---bash---pstree

我有以下可以从那一行中提取konsole的方法

代码语言:javascript
复制
pstree -A -s $$ | sed 's/systemd---//g;s/---.*//g' | head -1

这样才能很好地输出konsole。但是有些人只使用pstree命令输出,该命令可以如下所示。

代码语言:javascript
复制
systemd---kdeinit4---terminator---bash---pstree

或者这个

代码语言:javascript
复制
systemd---kdeinit4---lxterminal---bash---pstree

然后,当我添加sed命令时,它会提取kdeinit4而不是终止符。我可以想出几种方案来提取终端的类型,但是没有一个不包含条件语句来检查特定类型的终端。我遇到的问题是,我无法准确地预测有多少非亲属的东西可能在终端名称的前面或后面,或者它们将是什么,我也不能准确地预测终端名称是什么。有谁想办法解决这个问题吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-08-26 21:39:58

你可以用

代码语言:javascript
复制
ps -p "$PPID" -o comm=

代码语言:javascript
复制
ps -p "$PPID" -o fname=

如果shell没有PPID变量集,则可以使用

代码语言:javascript
复制
ps -p "$(ps -p "$$" -o ppid= | sed 's|\s\+||')" -o fname=

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

代码语言:javascript
复制
#!/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
票数 1
EN

Stack Overflow用户

发布于 2013-08-26 21:39:04

代码语言:javascript
复制
curTerm=$(update-alternatives --query x-terminal-emulator | grep '^Best:')
curTerm=${curTerm##*/}

printf "%s\n" "$curTerm"

结果是

代码语言:javascript
复制
terminator

当然可以不一样。

现在,您可以在sed命令中使用$curTerm变量。

但我不确定这是否能与符号链接一起正常工作。

票数 0
EN

Stack Overflow用户

发布于 2013-08-26 21:59:42

我不知道如何在您的系统中隔离终端名称,但作为一项解析练习,假设终端直接运行bash,您可以通过管道将pstree输出输送到:

代码语言:javascript
复制
 awk -F"---bash---" ' NF == 2 { count = split( $1, arr, "---" ); print arr [count]; }'

这将找到“bash”之前的单词,在您的例子中,这个词是

代码语言:javascript
复制
konsole
terminator
lxterminal

如果希望使用不同的shell类型,则可以展开字段分隔符,将它们包括如下所示:

代码语言:javascript
复制
awk -F"---(bash|csh)---" ' NF == 2 { count = split( $1, arr, "---" ); print arr[count]; }'

考虑到想象中的一条线,如:

代码语言:javascript
复制
systemd---imaginary---monkey---csh---pstree

awk会找到“猴子”作为终端名,以及测试集中的任何内容。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18453130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档