Разница между «kill | pgrep dnsspoof »и« kill `pgrep dnsspoof`»

С GNU sed:

sed '1~2 { h; d; }; G; s/\n//'

С awk:

awk '{ if(NR%2) save = $0; else print $0 save }'

С perl:

perl -pe '$_ = <> . $_; s/\n//'
0
07.12.2016, 08:20
2 ответа

Вы правы, что | передает вывод одной программы в другую. Данные передаются с влево на вправо . Таким образом, вы можете подумать, что

pgrep dnsspoof | kill

должен работать, поскольку pgrep найдет номер процесса dnsspoof и скармливает его kill , который затем убьет его. Оказывается, это не работает, так как kill смотрит только на командную строку, чтобы получить то, что нужно убить.

Итак, мы должны получить вывод pgrep в командной строке. Это то, что делает `pgrep dnsspoof` или более современный $ (pgrep dnsspoof) : он запускает команду внутри обратных кавычек или скобок и помещает вывод вместо команды. Итак, если pgrep dnsspoof выводит 5432 , то тогда выполняется команда kill 5432 , что является правильным способом вызвать программу уничтожения.

Использование $ () имеет несколько преимуществ, более легкое вложение, меньше вещей, которые нужно экранировать, поэтому, если ваша оболочка поддерживает их, вам следует использовать их вместо `` .

3
28.01.2020, 02:19

Вы правы насчет |, но вы выполняете команду противоположным образом, вы должны выполнить pgrep dnsspoof, затем отправить его вывод на вход kill, но он не принимает их команды на стандартном входе, они ожидают, что они будут прописаны в аргументах к команде, поэтому вам придется использовать xargs, который читает данные потока STDIN и преобразует каждую строку в аргументы к команде, разделенные пробелами:

pgrep dnsspoof | xargs kill

но в вашем случае вы посылаете вывод команды kill на вход команды pgrep dnsspoof, что не имеет смысла

1
28.01.2020, 02:19

Теги

Похожие вопросы