web-dev-qa-db-ja.com

使用している端末を確認するにはどうすればよいですか?

私のマシンにはUbuntuがあり、その上で素晴らしいウィンドウマネージャーを実行しています。実行している端末を確認するにはどうすればよいですか?コマンドはありますか?

21
user4943481

TL; DR

  • 現在実行中のシェルを見つけるには、ls -l /proc/$$/exeを使用します
  • 現在実行中の端末を見つけるには、xprop _NET_WM_PID WM_CLASSを使用します。 pidの値は、後でps -p <pid> -o argsコマンドに渡すことができます。
  • 技術的には、ターミナルエミュレータの場合、 comments に記載されているように、コマンドさえ必要ありません。

    どういう意味ですか? [ヘルプ]-> [バージョン情報]をクリックしますか? – JoKeR

シェルvsターミナル

最初に明確にする必要があるのは、正確に何が求められているかです-実行中のシェルまたは実行中のターミナルを見つけます。多くの場合、これらの2つの用語は同じ意味で使用されますが、まったく異なるものです。 Shellはコマンドラインインタープリターです。特に、Shellはコマンドを入力するプロンプトとテキストフィールドです。シェルは非対話型にすることもできます。たとえば、スクリプトが非対話型シェルを開始したり、bash -c 'echo hello world'も非対話型シェルを開始します。

対照的に、ターミナルはシェルへのインターフェイスです(ただし、別のアプリケーションでもかまいません)。もともと端末は実際のハードウェアを指していましたが、現在はほとんどがソフトウェアです。を押すと表示されるもの Ctrl+Alt+t または、GUIでターミナルアイコンをクリックすると、ターミナルエミュレーターが起動し、ハードウェアの動作を模倣するウィンドウが表示され、そのウィンドウ内でシェルが実行されていることがわかります。 Ctrl+Alt+F2 (または6つのファンクションキーのいずれか)は、仮想コンソール、別名ttyを開きます。 仮想端末が「仮想」である理由、および「本当の」端末が何/なぜ/どこにあるのか? の詳細を参照することをお勧めします。

シェル情報を取得する

各ユーザーには、/etc/passwdでユーザー名に割り当てられたデフォルトのシェルがあります。デフォルトの設定を使用しており、コマンドとして別のシェルを明示的に呼び出していない場合、次を実行するだけで十分です。

echo $Shell

しかし、もちろんこれはdefault値のみを表示します。以下を行うと仮定します。

user@ubuntu:~$ dash
$

元々はbashでしたが、/bin/dashbuntuのPOSIXまたはシステムシェル のインタラクティブセッションを開始しました。変数$Shellは、その目的ではないため、変更されません。現在の値ではなくデフォルトが表示されます。私たちは別の視点からこれにアプローチする必要があります-プロセスの視点、これは私がカバーしたものですbashまたはshを使用していますか?

$ echo $$
4824
$ cat /proc/4824/comm                                                          
mksh
$ bash
xieerqi@eagle:~$ echo $$
6197
xieerqi@eagle:~$ cat /proc/6197/comm
bash

ここでは、/proc/ファイルシステムを利用します。プロセスの名前とコマンドラインパラメータは、/proc/<pid>/commに表示されます。必要なのは、$$が行うシェルのPIDを提供することだけです。上記の例では、それを個別に追加していますが、ただ行うことを止めるものは何もありません

cat /proc/$$/comm

テーマのバリエーションも可能です

ps -p $$ -o args

これにアプローチできる別の方法は、/proc/<pid>/exeの場所を確認することです。このファイルは、実行可能ファイルを指すシンボリックリンクです。したがって、私たちはできる

user@ubuntu:~$ ls -l /proc/$$/exe
lrwxrwxrwx 1 adminx adminx 0 Apr  4 18:20 /proc/1241/exe -> /bin/bash
user@ubuntu:~$ sh
$ ls -l /proc/$$/exe
lrwxrwxrwx 1 adminx adminx 0 Apr  4 18:20 /proc/1255/exe -> /bin/dash

2つのアプローチのいずれも、ケースの99%で機能します。もちろん、それらを破壊する方法があります。たとえば、シェルの起動直後に実行可能ファイルが削除された場合、シンボリックリンクはどこにもポイントしません(その場合、/bin/sh/bin/dash、さらには/bin/bashはお勧めできません-多くのスクリプト、特にシステムレベルのスクリプトに依存しているためです。シェルのコマンド名は通常、execve() syscallの最初の引数として設定されます。これは bashがどのように呼び出されるかを知る方法 で説明されているため、execve()を介してシェルを起動するアプリケーションがある場合、任意の名前を付けることができます。しかし、これらは非標準的かつ非典型的なものであり、一貫性とセキュリティのために避けるべきです。


端末情報の取得

環境変数から始めることができます。多くの端末はxterm互換として自身をマスクしているようです。これはecho $TERMまたはecho $COLORTERMによって報告されます。しかし、環境変数はそれほど信頼できるツールではありません。これらは設定および設定解除できます。 PIDでも同じことができますが、今回は親PIDを調べます。覚えているかもしれませんが、ターミナルはシェルへのインターフェイスであり、多くの場合、シェル自体を起動します。したがって、シェルの親プロセスであるプロセスを見つけることができます。

$ ps -p $$ -o args,ppid
COMMAND                      PPID
bash                         1234
$ ps -p 1234 -o args
COMMAND
/usr/lib/gnome-terminal/gnome-terminal-server

別のターミナルアプリsakuraを試してみましょう。

$ ps -p $$ -o args,ppid
COMMAND                      PPID
/bin/bash                   16950
$ ps -p 16950 -o args
COMMAND
sakura

そこから、このシェルを開始したのはgnome-terminalであることがすでにわかります。もちろん、この方法は、インタラクティブシェルで作業していることを前提としています。たとえば、bash -c '...'の親、またはsshを介して起動されたシェルを見つけようとしている場合、PIDは非ターミナルアプリケーションからである可能性があり、GUIからではないかもしれません。

したがって、GUIターミナルを具体的に処理する場合は、xpropを実行し、目的のウィンドウをクリックして、そのpidをgrepし、pidに一致するプロセスの名前を調べます。または言い換えると:

$ ps aux | grep $(xprop | awk -F'='  '/PID/ {print $2}')                       
xieerqi   2124  0.6  1.7 208068 34604 ?        Sl   18:47   1:49 gnome-terminal

さらに、 仕様ごと として、ウィンドウマネージャーはWM_CLASSプロパティを設定する必要があります。したがって、xpropからも取得できます。

$ xprop WM_CLASS 
WM_CLASS(STRING) = "sakura", "Sakura"

もちろん、これには1%の欠点もあります:WM_CLASSプロパティの設定は、それを行うウィンドウマネージャーに依存しており、PIDはウィンドウの正確性を保証しません( このX11ウィンドウを作成したプロセスは? )、これには複雑なデバッグが含まれる場合があります。そして、これらはメソッド自体の欠点ではなく、X11サーバーの欠点です。ただし、最も安定した有名なウィンドウマネージャー(openbox、Metacity、blackboxなど)およびほとんどのアプリケーションは正常に動作するため、Gnomeターミナルやターミネーターなどの問題は発生しません。

しかし、GUIターミナルエミュレータに関しては、コマンドを見つける必要さえありません。ウィンドウ自体のAboutダイアログを使用するだけです。そのルールの例外はxtermです。

20

ショートバージョン(thx @ Serg

cat /etc/alternatives/x-terminal-emulator

ロングバージョン

Sudo update-alternatives --config x-terminal-emulator

出力で*を探します

;)


出力例

There are 7 alternatives which provide `x-terminal-emulator’.
選択の選択肢
 ———————————————– 
 1 /usr/bin/xterm
 2 /usr/bin/uxterm
 3 /usr/bin/koi8rxterm
 4 /usr/bin/lxterm
 * + 5 /usr/bin/gnome-terminal.wrapper
 6 /usr/bin/konsole
 7 /usr/bin/xfce4-terminal.wrapper
Press enter to keep the default[*], or type selection number:

または、 @ mur のおかげで、ここに詳細な出力があります

$ update-alternatives --display x-terminal-emulator
x-terminal-emulator - auto mode
  link currently points to /usr/bin/gnome-terminal.wrapper
/usr/bin/gnome-terminal.wrapper - priority 40
  slave x-terminal-emulator.1.gz: /usr/share/man/man1/gnome-terminal.1.gz
/usr/bin/koi8rxterm - priority 20
  slave x-terminal-emulator.1.gz: /usr/share/man/man1/koi8rxterm.1.gz
/usr/bin/lxterm - priority 30
  slave x-terminal-emulator.1.gz: /usr/share/man/man1/lxterm.1.gz
/usr/bin/mate-terminal.wrapper - priority 30
  slave x-terminal-emulator.1.gz: /usr/share/man/man1/mate-terminal.1.gz
/usr/bin/uxterm - priority 20
  slave x-terminal-emulator.1.gz: /usr/share/man/man1/uxterm.1.gz
/usr/bin/xterm - priority 20
  slave x-terminal-emulator.1.gz: /usr/share/man/man1/xterm.1.gz
Current 'best' version is '/usr/bin/gnome-terminal.wrapper'.
12
A.B.

使用しているターミナルプログラムを知りたい場合は、これを使用します。

ps -o 'cmd=' -p $(ps -o 'ppid=' -p $$)

ターミナル(シェル)を開いた直後にこれを実行しますシェルインスタンスを追加せずに

ターミナルプログラムを開くと、基本的に子プログラムであるシェルが生成されます。したがって、生成されたシェルの親は端末そのものです。つまり、シェルのPPIDは端末プログラムのPIDです。

ここで、シェルの親プロセスID(PPID)(bash)をps -o 'ppid=' -p $$で見つけています。これは端末プログラムのプロセスIDになります。

次に、PIDからプロセス名を見つけています。

$ ps -o 'cmd=' -p $(ps -o 'ppid=' -p $$)
gnome-terminal

基本的には次の1つのライナーです。

$ ps -o 'ppid=' -p $$
 2268

$ ps -o 'cmd=' -p 2268
gnome-terminal
9
heemayl

ターミナルウィンドウからprintenvと入力して、開いているセッションのすべての変数を表示します。

ターミナルウィンドウからecho $COLORTERMと入力します。 注:これはすべての端末で機能するわけではありません。sakuraなどの端末はこれを報告しません。

root@terrance-Linux:~# echo $COLORTERM
gnome-terminal

以下はaterm端子からのものです。

root@terrance-Linux:~$ echo $COLORTERM
rxvt-xpm
3
Terrance

端末プログラムの名前だけが必要な場合は、ほとんどの場合、[ヘルプ]> [バージョン情報]にあります。

3
thesdog
cat /etc/alternatives/x-terminal-emulator | grep exec

サンプル出力:

exec( 'gnome-terminal'、@ args);

私のシステムには答えがあります:gnome-terminal

したがって、gnome-terminalを端末に入力すると、別の同一の端末ウィンドウが開きます。

ソース:

0
Gabriel Staples