Не используйте {}
как часть текста скрипта sh -c
(проблема аналогична описанной в принятом ответе на Можно ли использовать `find -exec sh -c `безопасно?).
Вместо:
printf '%s\n' file* | xargs -n 3 sh -c './code output.txt "$@"; command2; command3' sh
Это будет работать, если имя файла не содержит символов новой строки. Если ваш xargs
имеет нестандартную -опцию -0
(, наиболее распространенная реализация имеет ), следующее также будет работать для имен файлов с символами новой строки:
printf '%s\0' file* | xargs -0 -n 3 sh -c './code output.txt "$@"; command2; command3' sh
"$@"
(кавычки важные)будут расширены до списка позиционных параметров внутри скрипта sh -c
. Это имена файлов, присвоенные сценарию xargs
. Кажущееся бесполезным sh
в самом конце будет помещено в $0
в скрипте sh -c
и использовано во всех сообщениях об ошибках, которые выдает эта оболочка (, она не является частью"$@"
).
В оболочке zsh
(, но не в, например. bash
или sh
),вместо этого вы могли бы сделать
for name1 name2 name3 in file*; do
./code output.txt $name1 $name2 $name3
command2
command3
done
Похожие: