Когда я бегу
ls -1 *.a | xargs -I{} echo {} | sed 's/.a//'
Выход
1
2
3
Когда я бегу
ls -1 *.a | xargs -I{} bash -c "echo {} $(echo {} | sed 's/.a//')"
и вывод
1.a 1.a
2.a 2.a
3.a 3.a
В чем причина этой аномалии?
Давайте предположим , что ваш в каталоге наличие файлов 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