скрипт оболочки bash, поиск сложной строки в make-файле (проблема расширения параметров оболочки)

У меня раздражающая проблема, я хочу, чтобы скрипт искал в make-файле (используя grep) конкретную раздражающую строку. Проблема лучше всего иллюстрируется конкретно:

someMakefile (минимальный Makefile):

#!/usr/bin/env bash
echo bla bla
OBJ_DIR='something'
EXE_FILE='my_exe'
cp $(OBJ_DIR)/$(EXE_FILE) ../bin/.
echo 'doing something else now'

testScript.sh (проверка на наличие сложной строки):

cat testScript .sh

#!/usr/bin/env bash
set -x
foundNumLines = $(grep -in 'cp $(OBJ_DIR)/$(EXE_FILE) ../bin/.' someMakefile)
echo "foundNumLines = $foundNumLines"
set +x

Из командной строки (это работает):

$ grep -in 'cp $(OBJ_DIR)/$(EXE_FILE) ../bin/.' someMakefile
5:cp $(OBJ_DIR)/$(EXE_FILE) ../bin/.

Из сценария (это НЕ работает, и я не могу понять, как заставить его работать): [ 119]

$ ./testScript.sh 
++ grep -in 'cp $(OBJ_DIR)/$(EXE_FILE) ../bin/.' someMakefile
+ foundNumLines = 5:cp '$(OBJ_DIR)/$(EXE_FILE)' ../bin/.
./testScript.sh: line 4: foundNumLines: command not found
+ echo 'foundNumLines = '
foundNumLines = 
+ set +x

Когда «grep» работает из скрипта, я хотел использовать, может быть, «wc» или подобное, чтобы обнаружить наличие строки, а затем сделать что-то, основываясь на этом ...

Я просто не могу заставить его работать, пробовал много комбинаций «» и т. Д. - надеюсь, вы понимаете, чего я пытаюсь достичь, пожалуйста, помогите с идеями / предложениями, спасибо!

3
задан 7 May 2019 в 19:16

1 ответ

Чтобы присвоить значения переменным, вам нужно var=value, а не var = value. Пробелы в этом контексте значительны, и поэтому вы получаете ошибку command not found из этой строки:

foundNumLines = $(grep -in 'cp $(OBJ_DIR)/$(EXE_FILE) ../bin/.' someMakefile)

Это не переменное присваивание, это три команды: foundNumLines, =, и $(grep ... ). Вам нужно:

foundNumLines=$(grep -in 'cp $(OBJ_DIR)/$(EXE_FILE) ../bin/.' someMakefile)

Я знаю, что вы сказали, что это был make-файл, но я должен отметить, что конструкция $() также имеет значение в оболочке. $(foo) запустит команду foo и вернет свой вывод. Поэтому эта строка:

cp $(OBJ_DIR)/$(EXE_FILE) ../bin/.

Сначала попытается выполнить $OBJ_DIR и $EXE_FILE как команды и вставить их выходные данные вместо переменных. Поскольку OBJ_DIR, вероятно, не будет командой, это означает, что вы будете выполнять

cp / ../bin/.

Или, если EXE_FILE находится в вашем пути и является исполняемым: кстати, там нет необходимости в ., ../bin/ совпадает с ../bin/.).

Я подумал, что упомяну это, так как у вас есть bash shebang в верхней части вашего примера make-файла, поэтому я предполагаю, что вы выполняете его как скрипт оболочки.

0
ответ дан 7 May 2019 в 19:16

Другие вопросы по тегам:

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