Неправильное поведение xargs

Вы могли использовать bc. Например,

$ echo "25 + 5" | bc
30

Кроме того, bc <<< 25+5 будет также работать.

Или в интерактивном режиме, если Вы хотите сделать больше, чем просто единственное простое вычисление:

$ bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
25 + 5
30

Реализация GNU bc печать, что информация о заголовке/авторском праве о запуске, когда и его stdin и stdout переходят к терминалу. Можно подавить его с (определенный для GNU) -q опция. Для получения дополнительной информации см. до н.э страницу справочника

1
13.04.2017, 15:36
1 ответ

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

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

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

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

1
27.01.2020, 23:54
  • 1
    Да, это была ошибка одинарных кавычек –  Rahul Patil 05.04.2013, 12:58

Теги

Похожие вопросы