Итак, я пишу сценарий оболочки BASH для выполнения некоторого тестирования CLI для проекта Node, над которым я работаю (я не пометил Node в этом вопросе, потому что на самом деле это относится исключительно к BASH); У меня тестирование CLI выглядит так:
test_command=$'node source/main.js --input-regex-string \'pcre/(simple)? regex/replace/vim\' -o';
echo $test_command;
$test_command 1>temp_stdout.txt 2>temp_stderr.txt;
test_code=$?;
echo "test_code $test_code"
test_stdout=`cat temp_stdout.txt`;
test_stderr=`cat temp_stderr.txt`;
Как видите, я использую кавычки в стиле C $'...'
, как , описанные здесь , что должно сделать это так, что $test_command
буквально расширяется до node source/main.js --input-regex-string 'pcre/(simple)? regex/replace/vim' -o
, который равен , что показывает echo
в строке 2, однако, когда я пытаюсь запустить команду в строке 3, я получаю сообщение об ошибке, что regex/replace/vim'
не является распознанным параметром командной строки в моем сценарии. Очевидно, что здесь происходит, несмотря на то, что я, казалось бы, правильно цитирую и экранирую все, BASH по-прежнему разбивает часть regex/replace/vim'
на свое собственное слово . Судя по всему, что я прочитал о правилах цитирования и разделения слов c из BASH, этого не должно происходить, но все же это происходит. Я попытался изменить кавычки в первой строке, чтобы использовать сильные / буквальные '
кавычки ('node source/main.js --input-regex-string "pcre/(simple)? regex/replace/vim" -o'
, что просто приводит к тому, что строка 3 обрабатывает все как одно слово и, следовательно, не работает), а слабые / динамические c "
кавычки ("node source/main.js --input-regex-string 'pcre/(simple)? regex/replace/vim' -o"
точно так же, как пример строгой кавычки, не говоря уже о том, что, поскольку строка в кавычках в этом случае является литералом регулярного выражения, она не подходит для поведения расширения c magi "
в любом случае) вместо кавычек в стиле C, изменяя экранирование самой командной строки, чтобы соответствовать любому используемому стилю кавычек; Я пробовал добавить к строке дополнительное экранирование, например test_command=$'node source/main.js --input-regex-string \\\'pcre/(simple)?\ regex/replace/vim\\\' -o
, только для того, чтобы наблюдать точно такое же поведение; и я попытался изменить способ вызова команды в строке 3: цитировать расширение, заключать его в { ... }
или ${ ... }
с комбинациями ранее упомянутых вариантов, все из которых по-прежнему приводили к исходной проблеме разделения слов или мне просто дали общую c синтаксическую ошибку «плохая подстановка».
Короче говоря, мой вопрос в том, как правильно вызывать / форматировать сохраненную команду как строка в переменной BASH, содержащая буквальную строку в кавычках, что BASH необъяснимым образом не разделит содержащуюся в кавычках строку и не сломает всю команду?