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
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
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, ваша команда неверна, поскольку она фильтрует строку literal whoami, и вы можете использовать grep -v "$(whoami)"; вы также можете использовать grep -v "$USER" для достижения желаемого эффекта.
Еще один лучший способ - позволить фильтрации ps дескриптора с -Nu в качестве показанного steeldriver или top:
$ top -u '!root' -n 1
] Однако я бы рекомендовал использовать фактическое имя входа - литералную строку - как в grep -v 'myuser' по трем причинам:
Можно создать пользователя с * персонаж: $ 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 +++
Обратите внимание, что оболочка расширена myuser1* на myuser1.pdf и myuser1.txt, в соответствии с чередованием оболочки. Не то, что вы ожидали, верно? Вторая причина: если вы входите в несколько имен пользователей (что могут сделать некоторые системные администраторы) или открывают несколько терминалов, вы можете запутаться в выходе whoami: $ whoami
root
$ logname
xieerqi
Если вы хотите отфильтровать процессы root это будет работать, но если вы вошли в систему как root, но хотите отфильтровать процессы вашего администратора, whoami не даст вам ничего, что вы намеревались. Переменные окружения могут быть отменены: $ unset USER
$ echo "empty $USER ?"
empty ?
Итак, что мы узнали из этого?
цитируйте переменные! знайте, что вы на самом деле вошли в систему, и как вы намерены быть осторожными с передачей материала в grep, попытайтесь использовать команды и их варианты, когда это возможноКак уже объяснил ответ steeldriver, ваша команда неверна, поскольку она фильтрует строку literal whoami, и вы можете использовать grep -v "$(whoami)"; вы также можете использовать grep -v "$USER" для достижения желаемого эффекта.
Еще один лучший способ - позволить фильтрации ps дескриптора с -Nu в качестве показанного steeldriver или top:
$ top -u '!root' -n 1
] Однако я бы рекомендовал использовать фактическое имя входа - литералную строку - как в grep -v 'myuser' по трем причинам:
Можно создать пользователя с * персонаж: $ 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 +++
Обратите внимание, что оболочка расширена myuser1* на myuser1.pdf и myuser1.txt, в соответствии с чередованием оболочки. Не то, что вы ожидали, верно? Вторая причина: если вы входите в несколько имен пользователей (что могут сделать некоторые системные администраторы) или открывают несколько терминалов, вы можете запутаться в выходе whoami: $ whoami
root
$ logname
xieerqi
Если вы хотите отфильтровать процессы root это будет работать, но если вы вошли в систему как root, но хотите отфильтровать процессы вашего администратора, whoami не даст вам ничего, что вы намеревались. Переменные окружения могут быть отменены: $ unset USER
$ echo "empty $USER ?"
empty ?
Итак, что мы узнали из этого?
цитируйте переменные! знайте, что вы на самом деле вошли в систему, и как вы намерены быть осторожными с передачей материала в grep, попытайтесь использовать команды и их варианты, когда это возможноКак уже объяснил ответ steeldriver, ваша команда неверна, поскольку она фильтрует строку literal whoami, и вы можете использовать grep -v "$(whoami)"; вы также можете использовать grep -v "$USER" для достижения желаемого эффекта.
Еще один лучший способ - позволить фильтрации ps дескриптора с -Nu в качестве показанного steeldriver или top:
$ top -u '!root' -n 1
] Однако я бы рекомендовал использовать фактическое имя входа - литералную строку - как в grep -v 'myuser' по трем причинам:
Можно создать пользователя с * персонаж: $ 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 +++
Обратите внимание, что оболочка расширена myuser1* на myuser1.pdf и myuser1.txt, в соответствии с чередованием оболочки. Не то, что вы ожидали, верно? Вторая причина: если вы входите в несколько имен пользователей (что могут сделать некоторые системные администраторы) или открывают несколько терминалов, вы можете запутаться в выходе whoami: $ whoami
root
$ logname
xieerqi
Если вы хотите отфильтровать процессы root это будет работать, но если вы вошли в систему как root, но хотите отфильтровать процессы вашего администратора, whoami не даст вам ничего, что вы намеревались. Переменные окружения могут быть отменены: $ unset USER
$ echo "empty $USER ?"
empty ?
Итак, что мы узнали из этого?
цитируйте переменные! знайте, что вы на самом деле вошли в систему, и как вы намерены быть осторожными с передачей материала в grep, попытайтесь использовать команды и их варианты, когда это возможно