ps aux --sort=-%cpu | grep -v 'whoami'
コマンドは、有効なユーザーによって開始されていないプロセスを出力することになっています。ただし、他のユーザーと同様にユーザーのプロセスも出力します。何が悪いのか説明してください。
grep -v 'whoami'
は、リテラル文字列に一致する行を除外しますwhoami
whoami
コマンドの出力に一致する行を除外する場合は、一重引用符をバッククォートで置き換える必要があります
ps aux --sort=-%cpu | grep -vFe `whoami`
または、代わりに$(...)
形式のコマンド置換を使用します
ps aux --sort=-%cpu | grep -vFe "$(whoami)"
または、ユーザーの選択を直接無効にすることで、grep
を完全にスキップすることもできます。
ps -Nu `whoami` --sort=-%cpu u
steeldriver's answer 既に説明したように、コマンドはliteral stringwhoami
に対してフィルタリングするため、間違っています。 use grep -v "$(whoami)"
; grep -v "$USER"
を使用して目的の効果を実現することもできます。
別のより良い方法は、ps
に、steeldriverが示した-Nu
またはtop
によるフィルタリングを処理させることです。
$ top -u '!root' -n 1
ただし、実際のログイン名を使用することをお勧めします-literal string-grep -v 'myuser'
のように、3つの理由から:
*
文字を使用してユーザーを作成することができます。
$ Sudo -p ">" useradd -s /bin/bash -p "$(mkpasswd -m SHA-512 '123')" 'myuser1*'
>
$ su 'myuser1*'
Password:
myuser1*@eagle:/home/xieerqi$
何でこれが大切ですか ?引用符なしで$()
を使用すると、ユーザー名の一部を含む可能性のあるファイルが存在する場合、ワイルドカードがシェルのグロビングの問題になる可能性があるため、コマンドが壊れます。
myuser1*@eagle:/home/xieerqi$ ps aux | strace -e execve grep -v
$(whoami) > /dev/null
execve("/bin/grep", ["grep", "-v", "myuser1.pdf", "myuser1.txt"],
[/* 82 vars */]) = 0
+++ exited with 1 +++
Shellのグロビングに従って、Shellがmyuser1*
をmyuser1.pdf
およびmyuser1.txt
に展開したことに注目してください。あなたが期待したものではありませんよね?
第二の理由-複数のユーザー名にログインしている場合(システム管理者が行う場合があります)、または複数の端末を開いている場合、whoami
の出力に混乱する可能性があります。
$ whoami
root
$ logname
xieerqi
root
プロセスを除外することを目的とする場合、これは機能しますが、root
としてログインしているが、管理ユーザーのプロセスを除外したい場合は、whoami
は提供しません。あなたが意図したもの。
環境変数は設定解除できます:
$ unset USER
$ echo "empty $USER ?"
empty ?
それで、これから何を学びましたか?
grep
にデータを渡すことに注意してください