Intereting Posts
Выход Capture (sdout / stderr) отправителя SSH-порта Почему Terminal и Shell являются двумя отдельными программами в Linux? создание и отправка самозаверяющего открытого ключа с использованием GnuPG в CentOS 7 Обработка текста – поиск текста до / после заданного слова Сценарий Bash застревает во время выполнения Разрешение запрещено: почему не удается запустить mongodb на / dev / sda4? rsync для копирования файлов, которые изменились Сопоставление определенных столбцов с другим файлом Что вызывает изменение идентификатора PCI Fedora не загрузится. Индикатор хода запуска идет полностью вправо, а затем все просто зависает Не удается запустить mysql на Fedora 19 Переключение контекста или высокая очередь выполнения, кто виноват? RDP автоматически вводит командную строку Кто устанавливает переменные среды USER и USERNAME? EFI Нет загрузчика. Конфигурационные файлы в \ loader \ entries \ *. Conf необходимы

Неверное поведение xargs

Я пытался решить эту проблему, используя find + xargs но я придерживался другой проблемы

Я пытаюсь увеличить счет используя ((a++)) но не работает. Я попробовал пару комбинаций подсчета значения, например. let a++ a=$[ $a + 1] и т. д.

См. Ниже Выход

 rax@ubuntu:~# find ./test/ -mindepth 1 | xargs -I{} -n1 bash -xc "((a++)) ; echo $a {}" + (( a++ )) + echo 0 ./test/abc1 0 ./test/abc1 + (( a++ )) + echo 0 ./test/abc1/abc 0 ./test/abc1/abc + (( a++ )) + echo 0 ./test/abc2 0 ./test/abc2 + (( a++ )) + echo 0 ./test/abc3 0 ./test/abc3 + (( a++ )) + echo 0 ./test/abcparent 0 ./test/abcparent 

EDIT: – xargs сделали все в одной оболочке

например. с pid

 rax@ubuntu:~# a=0 rax@ubuntu:~# find ./test/ -mindepth 1 | xargs -L2 -I{} bash -xc "echo $a {} ;((a++)) ; echo $a $$" + echo 0 ./test/abc1 0 ./test/abc1 + (( a++ )) + echo 0 1314 0 1314 + echo 0 ./test/abc1/abc 0 ./test/abc1/abc + (( a++ )) + echo 0 1314 0 1314 + echo 0 ./test/abc2 0 ./test/abc2 + (( a++ )) + echo 0 1314 0 1314 + echo 0 ./test/abc3 0 ./test/abc3 + (( a++ )) + echo 0 1314 0 1314 + echo 0 ./test/abcparent 0 ./test/abcparent + (( a++ )) + echo 0 1314 0 1314 

Проблема в том, что ваши переменные расширяются bash до того, как выполняется поиск. Из-за этого $a расширяется до 0, $$ расширяется до PID вашей (логина) оболочки, поэтому команда, выполняемая bash -xc на самом деле:

 echo 0 {} ;((a++)) ; echo 0 1314 

Здесь {} заменяется на xargs с результатом от find а значение $a является постинквизированным, но никогда не печатается. Попробуйте ускользнуть от переменных (как в \$a ) или даже лучше, поместив аргументы bash -xc в одинарные кавычки ( ' ) вместо двойных кавычек ( " ), чтобы увидеть, что он работает.

Вы также заметите, что другие комментаторы верны, xargs -n1 (или с -I{} ) выполняет новую оболочку для каждого аргумента, поэтому приращение $a не будет работать – приращение значения не будет видимым для следующего вызова команда bash -xc .