Bashが実行しているttyを取得する方法は?

Bashが実行しているttyを取得する方法は?

2番目のアプローチで提案されているこのページ、次のコマンドを使用してbashを実行するttyを取得できます。

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

私は自分で考えましたが、これは実際に少し怠惰です。実行中のプロセスの1つを抽出するためにすべての実行プロセスを一覧表示します。これを行う方が効率的ではありませんか? (これが望ましくない影響を与える可能性があるかどうか尋ねたい):

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

参考までに、この問題は、最初のコマンドが実際に2つ(またはそれ以上)行を生成するために発生しました。$$これは、他のプロセスが実行されていてそのPIDに部分文字列が含まれている場合にランダムに発生します。 2番目のアプローチでは、私が望むPIDを要求してこれを防ぎます。

答え1

以下を入力してください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

したがって、1つの結果のみを取得するにはgrepをフィルタリングする必要がありますが、これは見苦しくなります。

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

または使用

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

(制精神変種)

答え2

より効率的である場合は、はい。ps問題のあるプロセスをフィルタリングすることができます(そして、名前にプロセス番号を含むコマンドを選択するリスクを取るよりも正確です)。さらに、ヘッダー(オプションh)を生成しないように指示してプロセスを削除し、フィールド(オプション)のみを表示してプロセスをtail削除するように指示できます。TTYo ttyawk

したがって、以下は単純化されたコマンドです。

ps hotty $$

答え3

他の方法:

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.

(シェルのstdin、stdout、およびstderrが制御端末に接続されていない場合は、以下を開き、制御端末のファイル記述子を取得できます/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 $$

答え4

対話型シェルでは、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

関連情報