このページ によって提案された2番目の方法では、bashがコマンドで実行されているttyを取得します。
ps ax | grep $$ | awk '{ print $2 }'
私は確かにこれは少し怠惰であり、実行中のすべてのプロセスをリストしてそれらの1つを抽出するだけだと思います。次のことを行う方が効率的ではありませんか(これにより、望ましくない影響が生じるかどうかも尋ねています)。
ps -p $$ | tail -n 1 | awk '{ print $2 }'
ちなみに、最初のコマンドで実際に2行(またはそれ以上)の行が生成されることがあるので、この問題に遭遇しました。これは、$$
を部分文字列として含むPIDで実行されている別のプロセスがある場合、ランダムに発生します。 2番目のアプローチでは、私が知っているPIDを要求することで、このようなケースを回避しています。
単に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 }'
(より健全な変種)
より効率的にしたい場合は、はい、そうです。ps
は、問題のプロセスのみにフィルタリングできます(そして、それはより正確であり、たまたま持っているコマンドを取得するリスクを冒しません名前にあなたのプロセス番号)。それだけでなく、ヘッダーを生成せず(オプションh
)、tail
プロセスを削除し、TTY
フィールドのみを表示するように指示できます(オプションo tty
)、awk
プロセスを排除。
だからここにあなたの削減されたコマンドがあります:
ps hotty $$
それを行う他の方法:
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 $$
完全を期すために、言及されている他のpsコマンドはLinuxで機能しますが、ps -p $$ -o tty=
(@ 1_CRで言及)は nix Standard で定義されたオプションのみを使用するため、最近のすべてのUnixシステムに最も移植可能です。
対話型シェルでは、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