Трубопроводная команда из make-файла не работает - PullRequest
0 голосов
/ 11 февраля 2019

Я использую следующие команды в своих makefile

apps := $(shell fzr provide apps )
apps := $(subst ],,$(subst [,,$(apps)))

в командах, которые я получаю массив значений и удаляю из него массив [],

Я хочу запуститьэта команда в моем терминале, и я использую следующее

fzr provide apps | (subst ],,$(subst [,,$(apps))) | $(apps)

, и я получил ошибку

bash: apps: command not found
bash: apps: command not found
bash: subst: command not found
bash: subst: command not found

что мне здесь не хватает?

если я запускаю только

fzr provide apps

Я получил, который работает

[app1 app2 app3]

Идея состоит в том, чтобы проверить команду

apps := $(subst ],,$(subst [,,$(apps)))

, который работает на Mac, но в windows это не ...

Ответы [ 3 ]

0 голосов
/ 11 февраля 2019

Вот более короткая версия скрипта, которую разместил @tripleee:

fzr provide apps | tr -d '[]'

Это удаляет [ или ] символов везде, где они появляются во входной строке.

0 голосов
/ 12 февраля 2019

В вашем make-файле $(apps) расширяется до значения переменной makefile apps.Это делается во время чтения make-файла, и значение подставляется перед выполнением команды оболочки (таким образом, оболочка никогда не видит $(apps), а скорее видит appval1 или любые другие приложения.

Inоболочка, (я предполагаю, что оболочка bash), $(apps) означает команду запуска apps. Если вам нужно значение переменной оболочки, вы должны использовать ${apps}. Кроме того, $(subst) является конструкцией makeи оболочка тоже этого не понимает, поэтому вы должны заменить это чем-то (вероятно, sed).

Итак, в этом случае вам нужно будет сделать что-то вроде:

fzr provide apps | sed "s/[][]//g"

Примечание: это заменяет все квадратные скобки, а не только начальные и конечные. Если вы хотите просто использовать начальные и конечные скобки, см. Ответ tripleee.

0 голосов
/ 11 февраля 2019

Команды, которые действительны в Makefile, недопустимы в командной строке терминала.

Если вы хотите удалить начальные и конечные квадратные скобки в скрипте Bash, попробуйте

fzr provide apps |
sed 's/^\[//;s/\]$//'

Если вы хотите поместить это в Makefile, обратите внимание, что вам нужно будет удвоить знак доллара (один знак доллара оценивается самим make; удвоение его проходит через буквенный знак доллара в оболочке).

apps := $(shell fzr provide apps | sed 's/^\[//;s/\]$$//')

Ваш Makefile использует синтаксис, специфичный для GNU Make;возможно, версия make, установленная в Windows, не совместима с GNU.

...