私のマシンにはUbuntuがあり、その上で素晴らしいウィンドウマネージャーを実行しています。実行している端末を確認するにはどうすればよいですか?コマンドはありますか?
私のマシンにはUbuntuがあり、その上で素晴らしいウィンドウマネージャーを実行しています。実行している端末を確認するにはどうすればよいですか?コマンドはありますか?
回答:
ls -l /proc/$$/exe
xprop _NET_WM_PID WM_CLASS
。pid
後の値をps -p <pid> -o args
コマンドに渡すことができます。技術的には、ターミナルエミュレータの場合、コメントに記載されているように、コマンドも必要ありません。
どういう意味ですか?[ヘルプ]-> [バージョン情報]をクリックしますか?– JoKeR
最初に明確にする必要があるのは、正確に何が求められているかです-実行中のシェルまたは実行中のターミナルを見つける 多くの場合、これらの2つの用語は同じ意味で使用されますが、まったく異なるものです。シェルはコマンドラインインタープリターです。特に、対話型シェルは、コマンドを入力するプロンプトとテキストフィールドです。シェルは非対話型にすることもできます。たとえば、スクリプトは非対話型シェルをbash -c 'echo hello world'
開始したり、非対話型シェルを開始したりします。
対照的に、ターミナルはシェルへのインターフェイスです(ただし、別のアプリケーションでもかまいません)。もともと端末は実際のハードウェアを指していましたが、現在はほとんどがソフトウェアです。GUIでCtrl+ Alt+ を押すtか、ターミナルアイコンをクリックすると、ターミナルエミュレーター、ハードウェアの動作を模倣するウィンドウが起動し、そのウィンドウ内でシェルが実行されていることがわかります。Ctrl+ Alt+ F2(または6つのファンクションキーのいずれか)は、仮想コンソール(別名)を開きますtty
。仮想端末が「仮想」である理由と、「実際の」端末は何/なぜ/どこにあるのかを読むことをお勧めします。詳細については。
各ユーザーには、/etc/passwd
ユーザー名に割り当てられたデフォルトのシェルがあります。デフォルトの設定を使用しており、コマンドとして別のシェルを明示的に呼び出していない場合、次を実行するだけで十分です。
echo $SHELL
しかし、もちろんこれはデフォルト値のみを示しています。以下を行うと仮定します。
user@ubuntu:~$ dash
$
私たちは、もとあったbash
が、インタラクティブセッションを開始/bin/dash
、Ubuntuの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
またはによって報告される-compatible として自分自身をマスクしているようです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
です。
$SHELL
、必ず
ps | grep
ですか?ps -p $$
!または、コマンドだけのためにps -p $$ -o cmd=
。
ps | grep
ただ悪い形です。grepできるもののほとんどは、実際にps
それ自体で、または他のツールで取得できます。
ショートバージョン(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:
または、@muruのおかげで、より詳細な出力があります
$ 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'.
cat /etc/alternatives/x-terminal-emulator | grep exec
Binary file (standard input) matches
またはupdate-alternatives: error: unknown argument
-config'` を取得
--config
sudo
。使用update-alternatives --display x-terminal-emulator
file /etc/alternatives/x-terminal-emulator
、代わりに使用cat
するこのシンボリックリンクのターゲットを取得するために使用することを検討できます。このfile
ユーティリティはほとんどのシステムにインストールする必要があり、ターゲットの実行可能ファイルを見つけるために使用できます。cat
シンボリックリンクでは、このリンクのターゲットに応じて、任意のシェルスクリプトまたはバイナリファイル(gnome-terminal
バイナリファイルurxvt
などのシェルスクリプト)を出力できます。
使用しているターミナルプログラムを知りたい場合は、これを使用します。
ps -o 'cmd=' -p $(ps -o 'ppid=' -p $$)
シェルインスタンスをフォークせずに、ターミナル(シェル)を開いた直後にこれを実行します。
端末プログラムを開くと、基本的に子プログラムであるシェルが生成されます。したがって、生成されたシェルの親は端末そのものです。つまり、シェルのPPIDは端末プログラムのPIDです。
ここで、シェル(bash
)の親プロセスID(PPID)を見つけて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
sshd: username@pts/4
ます。注:PuTTYを使用してマシンに接続しています。でsshd
、実際に端末エミュレータ?
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
ため、端末に入力すると、別の同一の端末ウィンドウが開きます。
簡単な答え。コンソールまたはsshの両方で機能します。
単純な文字端末の例:
ssh username@systemname
echo $TERM
dumb
その接続ではGUIアプリを開けないことを伝えます
xtermの例(WindowsのPuTTY / Xmingでも動作します)
ssh -Y username@systemname -- omit this if using PuTTY --
echo $TERM
xterm
リーフパッドエディターやnautilusファイルマネージャーを開くなどのGUIコマンドを使用できることを意味します。
コンソールでは同じです:
Open terminal window
echo $TERM
xterm
TERM
デフォルトの端末エミュレータを定義する変数ではなく、現在の端末エミュレータの機能を定義する変数です。たとえば、変数を「xterm-color」に設定すると、端末で実行されているすべてのプログラムに、現在の端末が色を理解することになっていることがわかります。これを「linux」に設定すると、これがVTであることがプログラムに伝えられます。など