Когда я пишу программу bash, я обычно создаю вызовы вроде:
declare -a mycmd=( command.ext "arg1 with space" arg2 thing etc )
"${mycmd[@]}" || echo "Failed: foo"
Где die foo
- это функция bash, которая печатает Error foo
и выходит.
Но если я хочу четко объяснить причину ошибки, я хочу напечатать неудачную команду:
"${mycmd[@]}" || echo "Failed: foo: ${mycmd[*]}"
Таким образом, пользователь может запустить мертвую команду и выяснить, почему. Тем не менее, цитирование теряется на этом проходе - аргументы с сообщением Failed, которые имеют пробелы или экранированные символы, не печатаются способом, который может быть разрезан и запущен.
Есть ли у кого-нибудь предложение для компактного способа устранения этой проблемы?
Я думаю, что проблема заключается в том, как bash имеет дело с анализом аргументов для команд, а способ (встроенный) эхо обрабатывает аргументы. Другой способ заявить о проблеме:
Как распечатать кавычки вокруг аргументов с пробелами в следующем примере bash (который должен запускаться как script, а не в непосредственном режиме):
#!/bin/bash
mkdir qatest; cd qatest
declare -a myargs=(1 2 "3 4")
touch "${myargs[@]}"
ls
echo "${myargs[@]}"
фактический результат:
1 2 3 4
1 2 3 4
желаемый результат
1 2 3 4
1 2 "3 4"
ИЛИ
1 2 3 4
"1" "2" "3 4"
В нескольких дополнительных символах кода bash.
Вопрос закрыт: @camh великолепно ответил:
обновлен script:
#!/bin/bash
mkdir qatest; cd qatest
declare -a myargs=(1 2 "3 4")
touch "${myargs[@]}"
ls
echo "${myargs[@]}"
echo $(printf "'%s' " "${myargs[@]}")
выход:
1 2 3 4
1 2 3 4
'1' '2' '3 4'