Использование printf% q для передачи аргументов с пробелами - PullRequest
0 голосов
/ 05 марта 2019

Предположим, у меня есть скрипт, который выводит количество аргументов, переданных ему:

# file: num_args

echo "Number of arguments: $#"

Теперь мой вопрос относится к следующим вызовам:


> ./num_args a b c
> Number of arguments: 3 # As I would expect.

> ./num_args "a b c"
> Number of arguments: 1 # As I would expect.

> ./num_args a\ b\ c
> Number of arguments: 1 # As I would expect.

> printf "%q\n" "a b c"
> a\ b\ c                # As I would expect.

> ./num_args $(printf "%q" "a b c")
> Number of arguments: 3 # NOT as I would expect.

Учитывая, что printf Страница man утверждает, что

 %q     ARGUMENT is printed in a format that can be reused as shell input, escaping non-printable characters with the proposed POSIX $'' syntax.

Я не уверен, что произойдет в последнем случае выше.

1 Ответ

0 голосов
/ 05 марта 2019
Выход

printf %q корректно экранируется, чтобы интерпретатор оболочки интерпретировал его как как исходный код .

Однако расширения без кавычек не анализируются как исходный код;они проходят только через фазы расщепления струн и расширения глобуса.(Это хорошо: в противном случае обработка ненадежных имен файлов или другого потенциально опасного содержимого в сценариях оболочки будет почти невозможной).

Вы можете заменить этот вывод в команду оболочки, как в sh -c "...$foo..." или * 1009.* или ssh somehost "...$foo...";он не может (не должен) использоваться без кавычек.


Некоторые важные ссылки:

  • BashFAQ # 50 объясняет, почему строки, содержащие источниккод не может быть использован путем расширения их без кавычек.
  • BashFAQ # 48 объясняет риски, связанные с использованием eval (одно из семейств обходных путей, обсужденных выше).
...