выходной формат bash printf (% q) в xargs - PullRequest
0 голосов
/ 29 сентября 2018

Рассмотрим команды bash, выполняемые ниже.

Для справки из man xargs:

-t, --verbose Распечатать командную строку на стандартном выводе ошибок перед выполнениемэто.

# `printf` (1)
echo "meeny miny moe" | xargs -t -I {} printf "%q " "{}"
printf %q  meeny miny moe
'meeny miny moe'

# Then let's try the command output by `xargs`
printf %q  meeny miny moe
meenyminymoe

# `printf` (2)
echo "meeny miny moe" | xargs -t -I {} sh -c 'printf "%q " "$@"' -- "{}"
sh -c printf "%q " "$@" -- meeny miny moe
meeny\ miny\ moe

# Then let's try the command output by `xargs`
sh -c printf "%q " "$@" -- meeny miny moe
printf: usage: printf [-v var] format [arguments]

# `printf` (3)
printf "%q " "meeny miny moe"
meeny\ miny\ moe

Хорошо, (2) эквивалентно (3), оба имеют смысл для меня.У меня есть несколько вопросов.

Вопрос 1 Почему xargs выводит неправильную команду с -t: выполнение этой команды дает совершенно иной результат, чем фактическое выполнение xargs?Чего там не хватает, что xargs не печатает?

Вопрос 2 Почему результат из (1) отличается от результатов в (2) и (3)?Это xargs, который заключает в кавычки результирующий вывод, или это printf по какой-то причине делает это?

Замените %q на %s и

echo "meeny miny moe" | xargs -t -I {} printf "%s " "{}"
printf %s  meeny miny moe
meeny miny moe 

результат отличается, поэтому я предполагаю, что это не xargs цитирует вывод, это printf?Как я могу достичь того же результата только с printf без xargs?Почему printf ведет себя так только с xargs?

1 Ответ

0 голосов
/ 29 сентября 2018

Вопрос 1

При печати команды xargs опускает кавычки.Надо было написать:

printf "%q " "meeny miny moe"

Без кавычек вы получили:

printf %q  meeny miny moe

(обратите внимание на два пробела)

Вопрос 2

printf %q выходы в 1) и 2) различны, но оба они корректны.

Разница в том, что в 1) вы используете исполняемый файл printf (вероятно, в /usr/bin и в 2) вы используете встроенную printf, предоставляемую вашей оболочкой.

Попробуйте:

$ printf '%q\n' "meeny miny moe"
meeny\ miny\ moe

$ /usr/bin/printf '%q\n' "meeny miny moe"
'meeny miny moe'

$ command printf '%q\n' "meeny miny moe"
meeny\ miny\ moe
...