web-dev-qa-db-ja.com

bashが実行されているttyを取得する方法は?

このページ によって提案された2番目の方法では、bashがコマンドで実行されているttyを取得します。

ps ax | grep $$ | awk '{ print $2 }'

私は確かにこれは少し怠惰であり、実行中のすべてのプロセスをリストしてそれらの1つを抽出するだけだと思います。次のことを行う方が効率的ではありませんか(これにより、望ましくない影響が生じるかどうかも尋ねています)。

ps -p $$ | tail -n 1 | awk '{ print $2 }'

ちなみに、最初のコマンドで実際に2行(またはそれ以上)の行が生成されることがあるので、この問題に遭遇しました。これは、$$を部分文字列として含むPIDで実行されている別のプロセスがある場合、ランダムに発生します。 2番目のアプローチでは、私が知っているPIDを要求することで、このようなケースを回避しています。

30
Jonathan H

単にttyと入力するだけです:

$ tty 
/dev/pts/20

単純すぎて真実であることは明らかです:)

編集:最初の例では、ptyを実行しているプロセスのgrepも返されます。

$ ps ax | grep $$
28295 pts/20   Ss     0:00 /bin/bash
29786 pts/20   S+     0:00 grep --color=auto 28295

したがって、grepを除外して1つの結果のみを取得する必要があります。

ps ax | grep $$ | grep -v grep | awk '{ print $2 }'

または使用

ps ax | grep "^$$" | awk '{ print $2 }'

(より健全な変種)

51
Jakuje

より効率的にしたい場合は、はい、そうです。psは、問題のプロセスのみにフィルタリングできます(そして、それはより正確であり、たまたま持っているコマンドを取得するリスクを冒しません名前にあなたのプロセス番号)。それだけでなく、ヘッダーを生成せず(オプションh)、tailプロセスを削除し、TTYフィールドのみを表示するように指示できます(オプションo tty)、awkプロセスを排除。

だからここにあなたの削減されたコマンドがあります:

ps hotty $$
17
Toby Speight

それを行う他の方法:

readlink /dev/fd/0     #or 1 or 2 
readlink /proc/self/fd/0 #or 1 or 2
readlink -f /dev/stdin #or stdout or stderr; f to resolve recursively
#etc.

(標準入力、標準出力、標準エラー出力が制御端末に接続されていないシェルを使用している場合は、/dev/ttyを開いて、制御端末にファイル記述子を取得できます。

( { readlink /dev/fd/0; } </dev/tty; ) </dev/null  >output 2>&1

またはpsを使用:

ps h -o tty -p $$ #no header (h); print tty column; for pid $$
10
PSkocik

完全を期すために、言及されている他のpsコマンドはLinuxで機能しますが、ps -p $$ -o tty=(@ 1_CRで言及)は nix Standard で定義されたオプションのみを使用するため、最近のすべてのUnixシステムに最も移植可能です。

8
Random832

対話型シェルでは、wコマンドを使用できます。以下の例では、wは特定のユーザーによって実行されていることを報告し、もちろん、そのコマンドが実行されているTTYを示しています。

$ w
 11:20:08 up 5 min,  3 users,  load average: 0.34, 0.39, 0.20
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
xieerqi  :0       :0               11:15   ?xdm?   1:47   0.34s init --user
xieerqi  pts/0    :0               11:18   23.00s  0.05s  0.05s /bin/mksh
xieerqi  pts/10   :0               11:20    0.00s  0.03s  0.01s w
2