C プログラミング言語 (GNU/Linux) でターミナル エミュレーター (« aterm »、« xterm »、« konsole » など) の名前を取得する方法を探しています。いくつかの調査を行いましたが、何も見つかりませんでした。
5 に答える
これを確認する信頼できる方法があるとは思えません。
@larsmans が提案したように、TERM
env 変数を確認できますが、ほとんどのエミュレーターは同じ端末設定を使用します。
親プロセス ID ( getppid
) とその親 ( linux: 別のプロセスの親 pid をプログラムで取得しますか? ) などを、ターミナル エミュレーターのような名前のプロセスが見つかるまでチェックします...
または、pstree
単にその出力を処理した場合:
# pstree -As 12652
init---screen---bash---pstree
(申し訳ありませんが、私は X 端末を持っていないため、適切な例を示すことができません)
とにかく、これらのどれも完全に信頼できるものではありませんが、おそらくうまくいくでしょう。
端末の名前はTERM
環境変数によって与えられます。
char *termtype = getenv("TERM");
printf("The terminal type is %s\n", termtype);
これが機能するかどうかを確認してください。Emacs、urxvt、xterm、rxvt でテストしました。
#!/bin/zsh
terminal_emulator_parents=`pstree -As $$`
tep_list=`echo $terminal_emulator_parents | tr -s "-" | tr "-" " " \
| tac -s' ' | tr '\n' ' '`
found="false"
for process in `echo $tep_list`; do
if [[ $process =~ ("urxvt"|"xterm"|"rxvt") ]]; then # here: add all
found="true" # terminal emulators
break # you can think of
fi
done
if [[ $found == "true" ]]; then
echo "Terminal emulator: $process"
else
echo "Couldn't determine the terminal emulator."
fi
前の 2 つの回答をpstreeで構築し、環境変数を作成して .bashrc でターミナル エミュレータの種類を識別し、スクリプトでその情報にアクセスできるようにしました。
これを使用して、postactivate を使用して guake タブのタイトルを現在の仮想環境に設定し、postdeactivate でそれをクリアしますが、別の端末プログラムを使用しているときにたまたま仮想環境に入った場合に guake が呼び出されないようにします。
これが私のコードです:
.bashrcで
export TERM_TYPE=`pstree -As $$ | awk -F "---" '{print $2}'`
postdeactivate または postactivate で (「Terminal」を目的のタブ名に置き換えます)
#!/bin/bash
# This hook is run after every virtualenv is deactivated.
if [ "$TERM_TYPE" == "guake" ]; then
guake -r Terminal
fi
関数があります: ctermid() と gettyname()
ctermid は、指定された文字列で名前を返します
getttyname は、選択したファイル デバイスで動作します