u2api --zuser="$USER" --outfmtput=json SQL create_database name=$DATABASE
Мне бы хотелось легко (например, без экранирования, если это возможно) распечатать полученную команду вместо ее выполнения.
Есть ли встроенная возможность проведения такого рода тестирования в стандартных оболочках Linux, таких как bash?
решение1
Чтобы обработать общий случай, вам придется заключить переменные в кавычки и сохранить команду в виде массива:
$ USER='foo bar' DATABASE='baz ban'
$ command=(u2api --zuser="$USER" --outfmtput=json SQL create_database name="$DATABASE")
$ printf '%q ' "${command[@]}"; echo # To get a newline at the end
u2api --zuser=foo\ bar --outfmtput=json SQL create_database name=baz\ ban
Чтобы запустить массив команд:
"${command[@]}"
echo
Выполнение команды работает в некоторых очень простых случаях:
echo u2api --zuser="$USER" --outfmtput=json SQL create_database name=$DATABASE
Это самое простое решение, но оно показывает вам правильный вывод только в том случае, если расширения не содержат специальных символов, таких как пробелы (в частности, пробел, табуляция или новая строка) или экранированные символы. Например:
$ USER='foo bar'
$ echo u2api --zuser="$USER" --outfmtput=json SQL create_database name=$DATABASE
u2api --zuser=foo bar --outfmtput=json SQL create_database name=
Обратите внимание на отсутствующие кавычки вокруг имени пользователя. У вас будет та же проблема с любыми переменными без кавычек, содержащими пробелы.