我一直试图显示仅用作名称的终端类型。例如,如果我使用的是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而不是终止符。我可以想出几种方案来提取终端的类型,但是没有一个不包含条件语句来检查特定类型的终端。我遇到的问题是,我无法准确地预测有多少非亲属的东西可能在终端名称的前面或后面,或者它们将是什么,我也不能准确地预测终端名称是什么。有谁想办法解决这个问题吗?
发布于 2013-08-26 21:39:58
你可以用
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的父进程实际上可能是生成虚拟终端的进程,因此我们也可以这样找到它:
#!/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发布于 2013-08-26 21:39:04
curTerm=$(update-alternatives --query x-terminal-emulator | grep '^Best:')
curTerm=${curTerm##*/}
printf "%s\n" "$curTerm"结果是
terminator当然可以不一样。
现在,您可以在sed命令中使用$curTerm变量。
但我不确定这是否能与符号链接一起正常工作。
发布于 2013-08-26 21:59:42
我不知道如何在您的系统中隔离终端名称,但作为一项解析练习,假设终端直接运行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---pstreeawk会找到“猴子”作为终端名,以及测试集中的任何内容。
https://stackoverflow.com/questions/18453130
复制相似问题