Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 使用sed和pstree显示正在使用的终端类型_Linux_Bash_Shell_Sed - Fatal编程技术网

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

Linux 使用sed和pstree显示正在使用的终端类型,linux,bash,shell,sed,Linux,Bash,Shell,Sed,我一直在尝试显示仅用作名称的终端类型。例如,如果我使用konsole,它将显示konsole。到目前为止,我一直在使用这个命令 pstree -A -s $$ 这就输出了这个 systemd---konsole---bash---pstree 我有以下可以从该生产线提取konsole的产品 pstree -A -s $$ | sed 's/systemd---//g;s/---.*//g' | head -1 这就是康索尔的正确输出。但是有些人只使用pstree命令的输出,看起来像这样 s

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

pstree -A -s $$
这就输出了这个

systemd---konsole---bash---pstree
我有以下可以从该生产线提取konsole的产品

pstree -A -s $$ | sed 's/systemd---//g;s/---.*//g' | head -1
这就是康索尔的正确输出。但是有些人只使用pstree命令的输出,看起来像这样

systemd---kdeinit4---terminator---bash---pstree
还是这个

systemd---kdeinit4---lxterminal---bash---pstree
然后,当我添加sed命令时,它提取kdeinit4而不是terminator。我可以考虑几个场景来提取终端类型,但没有一个场景不包含条件语句来检查特定类型的终端。我面临的问题是,我无法准确预测终端名称前面或后面可能有多少非相关或非相关的东西,或者它们将是什么,也无法准确预测终端名称将是什么。有人对解决这个问题有什么想法吗

curTerm=$(update-alternatives --query x-terminal-emulator | grep '^Best:')
curTerm=${curTerm##*/}

printf "%s\n" "$curTerm"
结果是

terminator
当然,它可以是不同的。
现在,您可以在sed命令中使用
$curTerm
变量

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

您可以使用

ps -p "$PPID" -o comm=

如果您的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
#/bin/bash
shopt-s extglob
SHELLTTY=$(exec ps-p“$$”-o tty=)
P=$$

阅读P时,我不知道如何在系统上隔离终端名称,但作为解析练习,假设终端直接运行bash,您可以通过管道将pstree输出通过:

 awk -F"---bash---" ' NF == 2 { count = split( $1, arr, "---" ); print arr [count]; }'
这将找到“--bash--”之前的单词,在您的示例中是

konsole
terminator
lxterminal
如果需要不同的shell类型,可以展开字段分隔符以包括它们,如:

awk -F"---(bash|csh)---" ' NF == 2 { count = split( $1, arr, "---" ); print arr[count]; }'
考虑一条虚线,如:

systemd---imaginary---monkey---csh---pstree

awk会将“monkey”作为终端名以及测试集中的任何内容。

这里没有保证,但我认为这在linux上大多数情况下都是可行的:

ps -ocomm= $(lsof -tl /proc/$$/fd/0 | grep -Fxf <(lsof -t /dev/ptmx))

ps-ocomm=$(lsof-tl/proc/$$/fd/0 | grep-Fxf@JoSo我在
$TERM
中有
xterm
,但我正在使用
terminator
我也希望得到一个结果。今晚我做了更多的观察,下面是Ubuntu下的一行,例如将给出作为祖先的
init
-
mdm
。现在我认为我可以
体验ort
一些环境变量,如.profile中的
START\u TERM
,它可以为任何级别的脚本编写提供所需的结果,甚至是
fork()
exec()
(到目前为止还不错…),这些变量仅在从终端的直接子级运行时才起作用。(例如,尝试一下,
bash-c'ps-p$PPID-o comm=”
。因此它并没有真正解决“我遇到的问题是,我无法准确预测终端名称后面可能有多少非相关或非相关的东西。”是的,我期待着。有一个解决方案,但前提是OP有这个要求。我实际上想先提供一个更简单的解决方案。我在评论中引用的是OP的话,所以我想OP没有注意到前面的东西。但他给出的示例问题只涉及终端后面的任何东西。很好。我可以e使用了
$(ps-p$-o tty=)
;它比依赖dev 0作为符号链接更为通用。通常有几种方法。
ps -ocomm= $(lsof -tl /proc/$$/fd/0 | grep -Fxf <(lsof -t /dev/ptmx))