Я пытаюсь написать скрипт, который greps для текущего процесса.
Я пытаюсь избежать фактического grep от возврата из выхода ps aux.
] Однако я получаю переменные результаты, если я использую точку или нет:
ps aux | grep [s]elenium ничего не возвращает.
ps aux | grep [s]elenium.jar возвращает команду grep: [!d4 ]
beebee 36155 0.0 0.0 15940 956 pts/0 S+ 16:20 0:00 grep --color=auto selenium.jar
Почему это?
Проблема здесь, как @Florian perceptively выдумал, заключается в том, что оболочка расширяет символы glob в вашей строке поиска до подходящего имени файла перед передачей строки на grep.
Запуск ps aux | grep foo проблематичен, так как команда grep foo сама будет соответствовать foo и поэтому появится на выходе. Для этого существуют два распространенных, хотя и запутанных, обходных решения. Вы либо добавляете grep -v grep в конец трубы, либо используете grep [f]oo. Поскольку grep работает с регулярными выражениями, он будет рассматривать [f] как «любой символ в списке символов внутри скобок». Поскольку единственный символ в скобках - f, [f]oo эквивалентен foo. Однако процесс grep, отображаемый в результатах ps, будет иметь строку [f]oo и, следовательно, не найден grep.
Это становится более сложным, если, как вам кажется, у вас есть файл с именем foo в вашем текущем каталоге. Поскольку вы не указали выражение, которое вы дали grep (поскольку вы использовали [s]elenium, а не '[s]elenium' или "[s]elenium"), оболочка будет рассматривать его как , вычисленный и развернуть это соответствие имени файла. Это делает трюк [s]elenium бесполезным, поскольку то, что фактически передано в grep, это selenium, а не [s]elenium, поэтому grep будет соответствовать самому себе.
Все это, однако, происходит только потому, что вы не используете нужный инструмент для задания. Как это часто бывает, есть приложение для этого! Не используйте grep + ps. Вместо этого используйте pgrep, который предназначен для того, чтобы делать именно то, что вы хотите:
NAME
pgrep, pkill - look up or signal processes based on name and other
attributes
SYNOPSIS
pgrep [options] pattern
pkill [options] pattern
DESCRIPTION
pgrep looks through the currently running processes and lists the
process IDs which match the selection criteria to stdout. All the cri‐
teria have to match. For example,
$ pgrep -u root sshd
Итак, в вашем случае вы можете просто сделать
pgrep selenium
Или, поскольку вы 'запустив его через java, используйте -f, который просматривает всю командную строку:
pgrep -f selenium
Вы можете исключить «grep» после начального grep:
ps aux | grep '[s]elenium.jar' | grep -v grep