web-dev-qa-db-ja.com

xdotoolを使用してgnome-terminalのタブの数を数える

Gnome-terminalウィンドウで開いているタブの数を判断する方法を探しています。現在、最良のオプションはxdotoolのようです。次のタブに移動できます

xdotool key ctrl+Page_Down

唯一の問題は、開いているタブが1つしかない場合です。次に、上記のコマンドは、ターミナルウィンドウにゴミを出力します。ガベージは、これら3文字;5~(おそらくCtrl + Page_Downの文字表現です)です。

xdotoolまたはgnome-terminalがこれらの3文字を出力しないようにするにはどうすればよいですか? (トピック外:gnome-terminalウィンドウで開いているタブの数を決定する他の方法があるかどうかを誰かが知っているかどうかも知りたい)

4
Håkon Hægland

ターミナルのシェルから、このようなもののタブを数えたい

ps -h --ppid `ps -ho ppid $$` | grep pts | wc -l

タブは共通の親プロセスを共有し、擬似端末(pts)に関連付けられます。 $$変数には、呼び出しシェルのプロセスIDが含まれます。 -hスイッチは 'ps'にデフォルトのヘッダー行を抑制するように指示し、-oスイッチはカスタム形式を使用して親プロセスIDのみを返すように指示します。バックティックは、このコマンドの値を返すと言います。したがって、バックティックの出力は、現在のシェルの親の数値プロセスIDになります。 --ppidスイッチを使用して「ps」に渡すと、その親を持つすべてのプロセスが返されます。 TTYアソシエーションおよびカウント行のgrepでフィルターします。

2

方法#1

カウントをしたい同じウィンドウで実行されるOneliner:

expr $( echo $( xprop -root | awk '/_NET_ACTIVE_WINDOW/ && /0x/ {print $5}' | xargs xwininfo -all -id | awk '/child/ || /children/ {print $1}' ) ) / 2

ここに動作中のワンライナーがあり、5つの開いているタブを正しく報告します enter image description here

説明:

Gnome-terminalで気づいたのは、_xwininfo -all -id 0xXXXXXXX_(0xXXXXXはそのウィンドウの数値ID)を実行すると、1つのウィンドウに対して3つの子、2つのタブを持つウィンドウに対して5つの子、7つの子を報告することです3つのタブなどに。パターンを参照してください?整数除算を実行する場合(つまり、子を2で除算するときに整数のみを取得する場合、タブの数を取得します)。

それが、その行が基本的にexpr $(stuff that gets number of children) / 2していることです

子供の数を取得するにはどうすればよいですか?アクティブウィンドウの数値IDを持つ文字列を_xprop -root_の出力で検索し、その数値IDを引数として_xwindowinfo -all -id_に指定してから、その出力で子の数を検索します。

この方法の利点は?実行するウィンドウ内のタブの正確な数を示します。不利益 ? gnome-terminalでのみ動作し、sakuraでは動作しません

方法#2(粗悪であまり良くない)

私が見つけた別の方法がありますが、それは1つのウィンドウでのみ機能します。 _who -a_を実行すると、次のようなものが表示されます。

_serg  + pts/7        2015-04-11 08:47 00:02       17540 (:0)
serg  + pts/2        2015-04-11 08:27 00:12       17540 (:0)
serg  + pts/12       2015-04-11 08:50 00:08       17540 (:0)
serg  + pts/13       2015-04-11 08:56 00:01       17540 (:0)
serg  + pts/14       2015-04-11 08:58   .         17540 (:0)
_

+記号に注意してください。はい、単一のウィンドウにいる場合は、同じウィンドウ_who -a | grep "+" | wc -l_でこのコマンドを実行できます。今、ケネス・スティーブンソンは、彼らが同じpidを共有し、擬似端末に関連付けられていると適切に言及しましたか?はい、すべてのウィンドウがそれを行います。そのため、別のウィンドウを開いている場合、このメソッドは間違った結果をもたらします。

1