См. Комментарий @ilkkachu для практических решение для этого случая. Но в противном случае оболочка расширяет переменные перед выполнением каждой строки, поэтому
find ./ -type f -printf "wc -l %p\n" | while read line; do
$line
done
будет работать нормально (если в именах файлов не найдены специальные символы - например, пробелы).
Обратите внимание, что $ line
не имеет кавычек, и мы также не цитируем % p
.Это потому, что мы хотим, чтобы оболочка разбивала строку на слова перед выполнением - обрабатывая слова $ line
как команду и ее аргументы, как если бы вы написали их сами. Вот почему пробелы не работают.
Этого можно избежать, используя встроенный в оболочку eval
, который на самом деле работает так же, как вы вводили команду в оболочке, включая кавычки (которые сейчас вернулись) :
find ./ -type f -printf "wc -l \"%p\"\n" | while read line; do
eval $line
done
Последний должен работать во всех случаях, но все же не является хорошей практикой. eval
должен быть последним средством. Я включил эти параметры, чтобы вы знали, что они работают, но обычно есть более эффективные способы, такие как параметр -exec
в find
.