この「grep -v」が期待どおりに機能しないのはなぜですか?

この「grep -v」が期待どおりに機能しないのはなぜですか?

queryに関連する奇妙な問題がありますgrep -v。説明をお願いします:

私が使用している接続を表示するにはwho

$ who
harry    pts/0        2016-12-08 20:41 (192.168.0.1)
james    pts/1        2016-12-08 19:28 (192.168.0.1)
timothy  pts/2        2016-12-08 02:44 (192.168.0.1)

tty私の端末は現在pts/0

$ tty
/dev/pts/0
$ tty | cut -f3-4 -d'/'
pts/0

私の接続を除外してみましたgrep -v $(tty | cut -f3-4 -d'/')。接続なしでこのコマンドの期待される出力はですwho。しかし、出力は最も予想外のものです。

$ who | grep -v $(tty | cut -f3-4 -d'/')
grep: a: No such file or directory
grep: tty: No such file or directory

私はそれを$(...)引用符で囲み、「対応するファイルやディレクトリがありません」という問題を解決しているようです。しかし、私のtty(pts/0)を除外する必要がありますが、私の接続はまだ印刷されています。

$ who | grep -v "$(tty | cut -f3-4 -d'/')"
harry    pts/0        2016-12-08 20:41 (192.168.0.1)
james    pts/1        2016-12-08 19:28 (192.168.0.1)
timothy  pts/2        2016-12-08 02:44 (192.168.0.1)

grepこれまでクエリが失敗した理由はまったくわかりません。

ベストアンサー1

tty情報ページから。

'tty' は標準入力に接続された端末のファイル名を出力します。標準入力が端末でない場合は、「ttyではない」を印刷します。

問題は、あなたの場合、ttyの標準入力が端末ではなくパイプであることです。

これはこの例で見ることができます。

$ tty
/dev/pts/29
$ echo | tty 
not a tty

この問題を解決するには、次のようにします。

who | grep -wv "$(ps ax | awk "\$1 == $$ {print \$2}" )"

より高速で効率的な方法がありますが、2つのコマンドが必要です。

t=$(tty)
who|grep -wv "${t:5}"

おすすめ記事