Рассмотрим команды 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
?