Bash подстановочный знак в make-файле не работает - PullRequest
0 голосов
/ 16 мая 2018

У меня есть этот make-файл:

SHELL := /bin/bash -f

working : 
    if [ -d ffprob_runfail ]; then echo "gotcha" ;fi

error : 
    if [ -d ffprob_* ]; then echo "gotcha" ;fi

Выполнение команды 'make working' в папке, где существует подкаталог 'ffprob_runfail', повторяет:

if [-d ffprob_runfail]; тогда эхо "готча" фи

Гоча

Выполнение 'make error' в той же папке повторяет:

if [-d ffprob_ *]; тогда эхо "готча" фи

Я не уверен, откуда происходит это «удивительное» поведение - либо неправильное кодирование в синтаксисе make, либо в bash. Я пытался убежать *, но не получилось. Может ли быть проблема с синтаксисом оператора [] bash? (Я совсем новичок в bash, после 20 лет боли в csh ...)

Любая подсказка приветствуется.

РЕДАКТИРОВАНИЕ ПОЧТЫ:

Не только опция -f отключает глобирование (спасибо @choroba), но и оператор -d в bash является унарным и не может использоваться безопасно с глобализацией, т. Е. См. Скрипт Bash Shell: подтвердите существование одного или больше каталогов .

Так что, похоже, это правильный путь (продолжение предыдущего make-файла ...):

right : 
    for item in ffprob_* ; do if [ -d "$$item" ] ; \
    then echo "gotcha $$item";fi;done

1 Ответ

0 голосов
/ 16 мая 2018

Опция -f для bash означает то же, что и опция -f для set, а именно

-f Отключить генерацию имени файла (глобализация).

Если отключено глобирование, подстановочные знаки не раскрываются.

Итак, почему вы устанавливаете оболочку на bash -f? Удалить -f.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...