Эхо, что shell-escape-аргументы

Есть ли команда, которая не просто перехватывает его аргумент, но также удаляет их, если это необходимо (например, если аргумент содержит пробел или специальный символ)?

Мне понадобится это в магии оболочки, где вместо выполнения команды в одном script я повторяю команду. Этот вывод передается на python script, который, наконец, выполняет команды более эффективным образом (он загружает метод main() фактического целевого python script и выполняет его с данными аргументами и дополнительным параметром по вычислению witch данные кэшируются между прогонами main()).

Вместо этого я мог бы, конечно, портировать всю магию оболочки на python, где мне не нужно было что-либо делать.

Ответ 1

С bash встроенный printf имеет дополнительный спецификатор формата %q, который печатает соответствующий аргумент дружественным образом:

В дополнение к стандартным форматам printf (1), %b заставляет printf разворачивать escape-последовательности в соответствующем аргументе (кроме того, что \c завершает вывод, обратные косые черты в \', \" и \? не удаляются, а восьмеричные escape-последовательности, начинающиеся с \0 могут содержать до четырех цифр), а %q заставляет printf выводить соответствующий аргумент в формате, который может быть повторно использован как ввод оболочки.

Итак, вы можете сделать что-то вроде этого:

printf %q "$VARIABLE"
printf %q "$(my_command)"

чтобы получить содержимое переменной или выход команды в формате, который можно безопасно передать в качестве ввода снова (т.е. пробелы). Например:

$ printf "%q\n" "foo bar"
foo\ bar

(Я добавил новую строку, чтобы она была довольно в интерактивной оболочке.)