Вызывающая строка из bash и из sh отличается поведением

#bash #syntax

#bash #синтаксис

Вопрос:

При выполнении команды

 cmake ../../ -DCMAKE_C_FLAGS="-DFOO -DBAR ${CMAKE_C_FLAGS}"
  

в bash это работает нормально.

При прохождении скрипта происходит сбой:

 ./myscript "-DFOO -DBAR"

cmake ../../ -DCMAKE_C_FLAGS="-DFOO -DBAR ${CMAKE_C_FLAGS}"
Parse error in command line argument: -DBAR
  

myscript:

 #!/bin/bash
cmake_options='-DCMAKE_C_FLAGS="'$1' ${CMAKE_C_FLAGS}"'
echo "cmake ../../ "$cmake_options
cmake ../../ $cmake_options
  

Я знаю, что это должно быть как-то связано с экранирующими символами, поэтому я перепробовал все, что мог (двойные / одинарные кавычки, обратные кавычки, экранирование обратной косой черты, использование $ () и т.д.), Но я не смог найти исправление…

Я не эксперт по Linux, кто-нибудь может мне помочь, пожалуйста?

PS: Я работаю над cygwin, но я тестировал и на обычном Linux, и поведение такое же.

Редактировать:

@Assere как описано, я уже перепробовал много вещей, и изменение с $ 1 на «$ 1» не устраняет проблему. То, что я подразумеваю под «bash», находится непосредственно в командной строке, в то время как то, что я подразумеваю под «sh», — это «myscript.sh » файл. У меня есть #!/bin/bash, я просто не знал, что это называется shebang. Я также попытался процитировать $ cmake_options, но безрезультатно.

Комментарии:

1. Вероятно, вам следует начать с кавычек $1 вот так : "$1"

2. Также в вашем скрипте вы запускаете cmake команду в папке ../../ , тогда как в команде bash вы запускаете ее в ../../Sources папке

3. И почему вы говорите, что есть разница между bash и sh ? sh В вашем скрипте есть ошибка?

4. sh не имеет ничего общего с прямым вызовом скрипта. Есть ли у вас специальная строка в начале вашего файла сценария? Если нет, поместите следующий код в качестве 1-й строки вашего скрипта : #!/usr/bin/env bash . Это называется shebang и указывает Linux, какой интерпретатор использовать (здесь это заставляет использовать bash )

5. Также, когда у вас есть пробелы в вашей переменной, часто важно заключить их в кавычки. Попробуйте использовать кавычки $cmake_options как "$cmake_options" везде в вашем скрипте

Ответ №1:

вместо этого используйте этот скрипт:

 #!/bin/bash
cmake_options=-DCMAKE_C_FLAGS=""$1 ${CMAKE_C_FLAGS}""
echo "cmake ../../ "$cmake_options
cmake ../../ "$cmake_options"