コマンドラインから現在の端末の名前を取得するにはどうすればよいですか?


25

コマンドで端末のタイプを取得する可能性はありますか?

を使用しているgnome-terminal場合、出力はgnome-terminal類似したものになるはずです。ターミナルのバージョンを取得するのもいいでしょう。

更新

ps -aux | grep `ps -p $$ -o ppid=` 

このようなものを出力します:

user     4239  0.0  0.7 292708 15744 pts/8    Sl   11:39   0:02 xfce4-terminal
user     4800  0.0  0.0   6176   820 pts/0    S+   12:23   0:00 grep --color=auto  4239

これはxtermでも機能しますが、名前(xfce4-terminalこの場合)のみを取得するにはどうすればよいですか?


別のより良いアプローチで答えを更新しました。時間があれば、ご覧になり、それがあなたにも役立つかどうか教えてください。
テルドン14年

おかげしかし、rxvtのと最初の問題- > window 31457282 has no pid associated with it(Lubuntuでテスト)
TuKsn

ああ?くそー、それは奇妙だ。私はシナモンの下でテストしました。
テルドン14年

回答:


29

元のバージョン

これを行う1つの方法は、現在のシェルセッションの親プロセスを取得し、そこからターミナルの名前を取得することです。

  1. 現在のシェルプロセスの親を取得します。bash変数$$は現在のシェルのPIDであるため、それをps-p $$)へのクエリとして指定し、親プロセスのPIDを印刷するように要求できます(-o ppid=、末尾=は列ヘッダーの印刷を避けるためです)。

    $ ps -p $$ -o ppid=
    544
    

    したがって、シェルの親のPIDは544です。

  2. そのPIDに関連付けられたプロセスを取得し、そのコマンドラインを出力します

    $ ps -p 544 o args=
    /usr/bin/python /usr/bin/terminator
    

    上記の出力は、使用しているターミナルエミュレータによって異なりますterminator。私は使用しています。

  3. 単一のコマンドですべてを組み合わせる

    ps -p $(ps -p $$ -o ppid=) o args=
    
  4. それを使用してバージョンを取得します

    $(ps -p $(ps -p $$ -o ppid=) o args=) --version
    terminator 0.97
    
  5. に小さな機能を追加します ~/.bashrc使用しているターミナルエミュレータの名前とバージョンを返す(ほとんどの一般的なターミナルエミュレータで機能します)。

    which_term(){
        term=$(ps -p $(ps -p $$ -o ppid=) -o args=);
        found=0;
        case $term in
            *gnome-terminal*)
                found=1
                echo "gnome-terminal " $(dpkg -l gnome-terminal | awk '/^ii/{print $3}')
                ;;
            *lxterminal*)
                found=1
                echo "lxterminal " $(dpkg -l lxterminal | awk '/^ii/{print $3}')
                ;;
            rxvt*)
                found=1
                echo "rxvt " $(dpkg -l rxvt | awk '/^ii/{print $3}')
                ;;
            ## Try and guess for any others
            *)
                for v in '-version' '--version' '-V' '-v'
                do
                    $term "$v" &>/dev/null && eval $term $v && found=1 && break
                done
                ;;
        esac
        ## If none of the version arguments worked, try and get the 
        ## package version
        [ $found -eq 0 ] && echo "$term " $(dpkg -l $term | awk '/^ii/{print $3}')    
    }

    これで、ターミナルの名前を取得し、好きなオプションを渡すことができます(など)--version

異なるターミナルを使用したいくつかの例:

  1. xterm

    $ which_term
    XTerm(297)
    
  2. terminator

    $ which_term 
    terminator 0.97
    
  3. rxvt、これには-V-versionまたは--versionフラグがないため、バージョン情報は出力されません。

    $  which_term
    rxvt  1:2.7.10-5
    
  4. gnome-terminal

    $ which_term
    gnome-terminal  3.10.1-1
    
  5. konsole

    $ which_term
    Qt: 4.8.6
    KDE Development Platform: 4.11.3
    Konsole: 2.11.3
    
  6. lxterminal

    $ which_term
    lxterminal  0.1.11-4
    
  7. xfce4-terminal

    $ which_term
    xfce4-terminal 0.6.2 (Xfce 4.10)
    
    Copyright (c) 2003-2012
        The Xfce development team. All rights reserved.
    
    Written by Benedikt Meurer <benny@xfce.org>
    and Nick Schermer <nick@xfce.org>.
    
    Please report bugs to <http://bugzilla.xfce.org/>.
    

新しくなり改善された

ただし、上記のアプローチはそれほど信頼できるものではありません。su別のユーザーに接続した後にシェルを実行したとき、または端末が何か他のさまざまなケースにエイリアスされたときに、それは停止します。ここでは明らかにXプログラムで作業しているので、代わりにxdotool(でインストール可能sudo apt-get install xdotool)のようなものを使用して情報を取得する方が良いかもしれません:

perl -lpe 's/\0/ /g' /proc/$(xdotool getwindowpid $(xdotool getactivewindow))/cmdline

上記は、現在アクティブなウィンドウを起動するために使用されるコマンドラインを印刷します。端末はおそらくアクティブであるため、それが表示されるコマンドです。これは、ほとんどの端末エミュレーターでは、返される最初のフィールドが端末名であると安全に想定できることを意味します。

$ which_term 
lxterminal 

つまり、バージョンの取得は簡単です。例えば

$ dpkg -l $(which_term) | awk '/^ii/{print $3}'
0.1.11-4

そうではありませんgnome-terminal

$ which_term 
/usr/lib/gnome-terminal/gnome-terminal-server 

またはterminator

$ which_term
/usr/bin/python /usr/bin/terminator 

したがって、少し複雑にすることができます(ここにはいくつかのバシズムがありますが、これは移植性がありません)。

which_term(){
    term=$(perl -lpe 's/\0/ /g' \
           /proc/$(xdotool getwindowpid $(xdotool getactivewindow))/cmdline)

    ## Enable extended globbing patterns
    shopt -s extglob
    case $term in
        ## If this terminal is a python or perl program,
        ## then the emulator's name is likely the second 
        ## part of it
        */python*|*/perl*    )
         term=$(basename "$(readlink -f $(echo "$term" | cut -d ' ' -f 2))")
         version=$(dpkg -l "$term" | awk '/^ii/{print $3}')
         ;;
        ## The special case of gnome-terminal
        *gnome-terminal-server* )
          term="gnome-terminal"
        ;;
        ## For other cases, just take the 1st
        ## field of $term
        * )
          term=${term/% */}
        ;;
     esac
     version=$(dpkg -l "$term" | awk '/^ii/{print $3}')
     echo "$term  $version"
}

これは、テストしたすべてのケースで機能します。


@ Xubu-Turうーん、私は手動で別の端末から各端末を起動してみましたが、うまくいきました。デスクトップ環境のメニューのパスが異なるか、ターミナルの起動方法が何らかの形で異なると思われます。それらをどのように起動し、どのエラーが発生したかを正確に教えていただければ、もっと良いものを提供できるかもしれません。メニューから起動した場合は、メニュー項目が実行するコマンドを確認してください。
テルドン14年

@ Xubu-Turはスクリーンショットを追加しません。エラーメッセージを質問に貼り付けてください。メニュー項目が起動するコマンドには同じです。写真から手動でコピーすることを期待しないでください!
テルドン14年

2
を使用$PPIDして、親プロセスのPIDを取得できます。
nyuszika7h

@ nyuszika7hはい、できますし、そのために+1しますが、私はむしろそうしません。チェックしたところ、kshまたはでは利用できませんtcsh。私のアプローチよりもはるかに単純であるため、bashファミリーにとっては非常に良い考えです。
テルドン14年

それは間違いで利用可能だksh93mksh
nyuszika7h

8

これを試して、

ps -aux | grep `ps -p $$ -o ppid=` | awk 'NR==1{print $11}'

または

ps -aux | grep `ps -p $$ -o ppid=` | awk 'NR==1{print $NF}'

最初に失敗するrxvtterminator、2番目の上に失敗uxtermし、gnome-terminal(それが印刷/usr/lib/gnome-terminal/gnome-terminal-server)。suセッションを使用している場合、それらはすべて(私のように)失敗します。
テルドン14年

7
basename "$(cat "/proc/$PPID/comm")"

$PPIDシェルの親プロセスのPIDです。コマンドをcomm意味します。完全なパスである場合とそうでない場合があるため、basename場合とそうでない場合があるため、必要に応じてパスを削除します。

注意事項

これらはおそらく他の回答の少なくともいくつかにも当てはまります。

  • comm技術的にはargv[0]、実際には任意の文字列にすることができます。しかし、一般的には、この特定のケースでは信頼できるはずです。

  • これは、SSH経由で接続するかtmuxscreenまたは同様のものを使用する場合、期待どおりに機能しません。


これは非常に素晴らしい+1ですが、ターミネーター端末でterminは出力としてのみ取得します。
TuKsn 14年

理由はわかりませんが、おそらくターミネーターのせいです。
nyuszika7h 14年

それは、Pythonスクリプトとして実行されるからだと思います。それは本当に迷惑です。
テルドン14年

$PPIDすべてのシェルで標準ではないことに注意してください。例えば、tcsh私は次のようになります。PPID: Undefined variable.
arielf 14

2

次のコマンドを試すことができます。

$ dpkg-query -W $COLORTERM
gnome-terminal  3.6.2-0ubuntu1

更新(OPおよびAvinash Rajに感謝):

$ dpkg-query -W $(ps -aux | grep "`ps -p $$ -o ppid=`" | awk 'NR==1{print $11}' | xargs basename)
rxvt    1:2.7.10-5

私は...彼はその時に「パテ」を使用している場合、アクティブ端末セッション:)だから、それを知りたいと思う
Rinzwind

「putty」以上ではありませんがgnome-terminal 3.6.2-0ubuntu1l、xtermについてはどうですか、このコマンドでxterm でも取得できますか?
TuKsn 14年

2
これは、現在使用している端末を印刷しません。デフォルトの$ COLORTERMに設定されているものをすべて出力します。これは、その時点で使用しているものとは関係ありません。
テルドン14年

アップデートはxtermでもうまく機能し、バージョンと名前を表示します。
TuKsn 14年

すべての功績は、@ Avinashとあなたに正しい指揮権を与えます。バージョンを追加しました。
シルヴァンピノー14年

2

別の(完全ではない)可能性は次のとおりです。

xprop -id $WINDOWID WM_CLASS | cut -d" " -f3 | sed 's/^.\(.*\)..$/\1/'

しかし、環境変数があるため、これはlxterminalでは機能しません $WINDOWID空である ...

ターミネーターは「x-terminal-emulator」という名前を示します。


0

現在の端末は、エスケープシーケンスを介して検出することもできます。 デバイス属性(セカンダリDA)

たとえば、bashの場合:

read -s -dc -p $'\E[>c' da;da=${da##$'\E'[>};echo "${da//;/ }"

これはある種のidのみを返します-悲しいことに、これらを実際の名前に変換する公式のリストを知りません。


既知のIDを端末名に変換する実際の実装については、次のサンプルbashスクリプトを参照してください:https : //github.com/mintty/utils/blob/master/terminal

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.