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


24

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

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

確かにこれは少し怠け者であり、実行中のすべてのプロセスをリストして、そのうちの1つを抽出するだけです。より効率的ではないでしょうか(これが望ましくない効果をもたらすかどうかも尋ねています):

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

参考までに、この問題に出くわしたのは、最初のコマンドで実際に2行(またはそれ以上)の行が生成される場合があるためです。これは$$、サブストリングとして含まれるPIDで実行されている別のプロセスがある場合、ランダムに発生します。2番目のアプローチでは、必要なことがわかっているPIDを要求することで、このようなケースを回避しています。


6
最も効率的なのはtty、bashセッション内でコマンドを実行することです。あなたが使用して主張する場合 ps-ps -p $$ -o tty=
iruvar

回答:


46

次のように入力するだけ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 }'

(より健全なバリアント)


はい、それが実際に最初に提案された解決策です(実際はそうですtty | sed -e "s:/dev/::")。しかし、私はそのページで2番目に提案された解決策は非効率的であるだけでなく間違っていると思います!私はtty文句を言うのをやめます。:)
シェルジョン

最初のものは、あなたが気づくようにpty実行中のプロセスも返しますgrep
Jakuje

2
grepを使用してawkいる場合は必要ありません。例ps ax | awk "/^$$/ {print \$2}"-シングルクォートではなくダブルクォートとエスケープされた\$2。しかし、あなたが言うように、使用することttyは正しい解決策です。
cas

そのようにグラップすると、PIDが10で、PID 103もある場合など、誤った一致が発生する可能性があります。使用awk -vpid=$$ '$1 == pid {print $2}'
Barmar

ここでttyは、node.js でのスポーンはまったく機能しないがps、友人は正常に機能していることに注意してください。
スティーブンルー

17

より効率的にしたい場合は、はい、あなたはps問題のプロセスだけにフィルターをかけることができます)。それだけでなく、ヘッダーを生成しない(オプションh)ことでtailプロセスを排除し、TTYフィールドのみを表示する(オプションo tty)ことでawkプロセスを排除することもできます。

縮小コマンドは次のとおりです。

ps hotty $$

10

他の方法:

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 $$

2
(1)プロセスの現在の/制御ttyはどのファイル記述子にも関連付けられておらず、どのfdでも開くことが保証されていないことに気付いてうれしいです。しかし、その偶発事態の回避策として提供するコマンドを試しましたか?試してみると、取得できるのは/dev/ttyであり、制御tty(では報告されていません)ではありませんps。(2)私はそれ{ readlink /dev/fd/0; } < /dev/ttyが(常にそうであると)readlink /dev/fd/0 < /dev/tty信じています—そうでなければ信じますか?もしそうなら、あなたはそれを正当化できますか?(3)コマンドの2番目のセミコロン(の後のセミコロン/dev/tty)は不要です。
スコット

6

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


2

対話型シェルでは、そのためのwコマンドを使用できます。bellowの例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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.