В оболочках POSIX значение специальной встроенной переменной $ #
соответствует количеству установленных позиционных параметров. Пример: [
] Установите
$ 1
,$ 2
и$ 3
и установите для «$ #
» значение 3:
set c a b
find "$1" -name "*.html" -print0 | sort -zn | xargs -r -0 -n 1 sh -c '
echo "Dumping file: $2" >> "$1"; w3m "$2" >> "$1" 2>&1
' sh "$2"
Еще одна оптимизация может быть:
find "$1" -name "*.html" -print0 | sort -zn | xargs -r -0 -n 1 sh -c '
exec 1>> "$1" 2>&1
echo "Dumping file: $2"
w3m "$2"
' sh "$2"
, так как обе команды echo
и w3m
делают одно и то же со своими файловыми дескрипторами 1 и 2, поэтому лучше сделать это вначале в одном месте.
Вы также можете избежать запуска одного sh
для каждого файла с помощью:
find "$1" -name "*.html" -print0 | sort -zn | xargs -r -0 sh -c '
out=$1; shift
for file do
echo "Dumping file: $file"
w3m "$file"
done >> "$out" 2>&1
' sh "$2"
Просто удалите их из одинарных кавычек:
... sh -c 'echo "Dumping file: "{} >> '"$2"'; w3m {} >> '"$2"' 2>&1'
Оболочка склеит все воедино.
Некоторые способы обхода цитирования заключаются в передаче переменных во внутреннюю sh
в качестве аргументов:
log=$2
... | xargs -I {} sh -c 'echo "Dumping file: $1" >> "$2"; w3m {} >> "$2" 2>&1' sh {} "$log"
или просто export
соответствующие переменные, чтобы вы обращались к ним по имени
export log=$2
... | xargs -I {} sh -c 'echo "Dumping file: $1" >> "$log"; w3m {} >> "$log" 2>&1' sh {}
Хотя обратите внимание, что простые find
и xargs -L
могут работать плохо, если у вас странные имена файлов :новые строки, очевидно, и -L
специально обрабатывает конечные пробелы.