1

Когда я бегу

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 ответ1

1

Давайте предположим , что ваш в каталоге наличие файлов 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .