Использование трубы в файле Make - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь создать команду make, которая использует трубу. Но команда не выполняется должным образом.

Пример

SHELL:=/bin/bash

all:
    $(shell ps aux | grep -i someProcName)

Выход:

bash: kls602: command not found
grep: kls602: No such file or directory
grep: 46905: No such file or directory
grep: 0.0: No such file or directory
grep: 0.0: No such file or directory
grep: 4306668: No such file or directory
grep: 6480: No such file or directory
grep: s008: No such file or directory
grep: S: No such file or directory
grep: 12:22PM: No such file or directory
grep: 0:00.57: No such file or directory
...

Это похоже на вывод команды ps в качестве файла для поиска в команде grep. Я не могу понять, что я делаю неправильно.

Итак, как вы пишете полусложную команду bash в make? Я бы предпочел лучший ответ, чем «Просто запустите скрипт bash вместо того, чтобы поместить команду в make-файл».

1 Ответ

0 голосов
/ 17 января 2019

Использование $(shell...) в рецепте - это анти-паттерн. Вы никогда не должны делать это, кроме как в самых необычных, странных ситуациях. Рецепт IS сценарий оболочки, поэтому запуск $(shell ...) в лучшем случае избыточен.

Во-вторых, прочитайте, что делает функция shell :

Функция shell выполняет ту же функцию, что обратные кавычки (‘` ’) выполняют в большинстве оболочек: она выполняет расширение команды. Это означает, что она принимает в качестве аргумента команду оболочки и вычисляет ее результат.

Так что ваше понимание того, что происходит, совершенно правильно, и именно это и должно быть.

Вы должны написать это просто:

all:
        ps aux | grep -i someProcName
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...