3

В качестве упражнения я хотел убить процесс с помощью командной строки, используя базовые принципы bash, но у меня есть некоторые ошибки, которые я не понимаю:

ps -A | grep nautilus | egrep -o '[0-9]{4,5}' | kill

1) не работает

Если я попробую

ps -A | grep nautilus | egrep -o '[0-9]{4,5}' > kill

2) тоже не работает

3) Если я делаю (..) egrep '\d' (...) не должно ли это быть таким же, как [0-9]?

4) Есть ли способ сделать что-то вроде этого:

kill < (greps (...) )

7 ответов7

5

Пытаться

kill `ps -A | grep nautilus | egrep -o '[0-9]{4,5}'`

Команды внутри обратных кавычек будут выполняться и подаваться как часть команды.

3
  1. | оператор подает "стандартный вывод" (stdout) слева на "стандартный ввод" справа; стандартный ввод, или stdin, эквивалентен «тому, что я читаю, как будто от пользователя, если они вводят меня». Команда kill(1) убивает идентификаторы процесса, указанные в его командной строке, а не в его стандартном вводе. Так что вставка xargs перед kill поможет:

    ... | xargs kill
    

    поскольку xargs(1) берет свой stdin и объединяет его в порции, чтобы повторно вызывать предоставленную команду (здесь "kill") с командными строками, состоящими из этих порций.

  2. Оператор > используется для перенаправления stdout в файл, поэтому вы создали новый файл в текущем каталоге с именем "kill" и содержимым pids.

  3. Шаблон \d не является частью "стандартных" или "расширенных" языков регулярных выражений; вместо этого он был введен Perl (я считаю) и во многих более поздних вариантах языка регулярных выражений. PCRE для регулярных выражений, совместимых с Perl, предоставляет библиотеку, которая способствовала распространению расширенного синтаксиса на многие другие инструменты и языки, но, безусловно, не является единственной реализацией сегодня. Существуют веб-сайты, которые предоставят вам матричные сравнения различных языков регулярных выражений.

    PCRE поставляется с pcregrep(1) который поймет \d для вас; Кроме того, современный GNU grep имеет опцию -P , которая будет использовать PCRE для регулярных выражений.

  4. Вы находитесь здесь после концепции, называемой "подстановка команд", где стандартный вывод команды используется непосредственно в командной строке; современный синтаксис для этого - $(...) , хотя вы также увидите, что используются обратные пометки, `...`, но это исторически сложившаяся ситуация. Так:

    kill $(ps ... | pcregrep ... | munge)
    
2

Если вы знаете имя исполняемого файла, лучше использовать pidof чтобы найти pid работающей программы.

2

Вы также можете попробовать killall:

killall nautilus

(из пакета psmisc , по крайней мере, в Debian / Ubuntu).

1

В большинстве Linux есть pkillpgrep), которые делают то, что вы хотите.

pkill nautilus
0

Я бы пошел на xargs:

ps -A | grep nautilus | egrep -o '[0-9]{4,5}' | xargs -L 1 kill

На самом деле kill принимает несколько аргументов, поэтому -L 1 строго не нужен.

-1
   ps -A | grep nautilus | awk '{print "kill " $1}' | bash

Я бы сделал это таким образом, но есть много способов выполнить то же самое =) У меня был этот ответ подробно выписан на stackoverflow, чтобы найти его перенесенным сюда.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .