私のマシンにはUbuntuがあり、その上で素晴らしいウィンドウマネージャーを実行しています。実行している端末を確認するにはどうすればよいですか?コマンドはありますか?
ls -l /proc/$$/exe
を使用しますxprop _NET_WM_PID WM_CLASS
を使用します。 pid
の値は、後でps -p <pid> -o args
コマンドに渡すことができます。技術的には、ターミナルエミュレータの場合、 comments に記載されているように、コマンドさえ必要ありません。
どういう意味ですか? [ヘルプ]-> [バージョン情報]をクリックしますか? – JoKeR
最初に明確にする必要があるのは、正確に何が求められているかです-実行中のシェルまたは実行中のターミナルを見つけます。多くの場合、これらの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/dash
、 buntuの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
です。
ショートバージョン(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'.
使用しているターミナルプログラムを知りたい場合は、これを使用します。
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
ターミナルウィンドウからprintenv
と入力して、開いているセッションのすべての変数を表示します。
ターミナルウィンドウからecho $COLORTERM
と入力します。 注:これはすべての端末で機能するわけではありません。sakura
などの端末はこれを報告しません。
root@terrance-Linux:~# echo $COLORTERM
gnome-terminal
以下はaterm
端子からのものです。
root@terrance-Linux:~$ echo $COLORTERM
rxvt-xpm
端末プログラムの名前だけが必要な場合は、ほとんどの場合、[ヘルプ]> [バージョン情報]にあります。
cat /etc/alternatives/x-terminal-emulator | grep exec
サンプル出力:
exec( 'gnome-terminal'、@ args);
私のシステムには答えがあります:gnome-terminal。
したがって、gnome-terminal
を端末に入力すると、別の同一の端末ウィンドウが開きます。