Давайте предположим, что ваш в каталоге наличие файлов 1.a
, 2.a
, 3.a
.
С помощью команды
ls *.a | xargs -I{} echo {} | sed 's/.a//'
у вас нет подоболочек, вывод ls
которых передается по каналу, xargs
которые делают его замены. Затем вывод передается по каналу sed
. Отсюда ваш первый результат.
С помощью команды
ls *.a | xargs -I{} bash -c "echo {} $(echo {} | sed 's/.a//')"
у вас есть новый элемент $(echo {} | sed 's/.a//')
.
Расширяется и становится
echo {} # -- > {} echo {} | sed 's/.a//' # -- > {} again the same.
так что ваша команда может быть переписана как
ls *.a | xargs -I{} bash -c "echo {} {} "
это дает ваш второй вывод.
Как только что сказал и гость в своем комментарии, отладьте ваш скрипт [ 1 ] (или команду); с set -x
вами включить отладку в текущей оболочке или сценарии и с set +x
отключить его:
set -x ls *.a | xargs -I{} bash -c "echo {} $(echo {} | sed 's/.a//')" set +x
и вы увидите каждый шаг
+ ls --color=auto 1.a 2.a 3.a ++ echo '{}' ++ sed s/.a// + xargs '-I{}' bash -c 'echo {} {}' 1.a 1.a 2.a 2.a 3.a 3.a