Как динамически создавать аргументы, содержащие пробел в bash - PullRequest
1 голос
/ 04 февраля 2020

У меня есть скрипт find-files, который создает пути, которые могут содержать пробелы в строках

/foo bar
/abc

Я хочу преобразовать эти пути в аргументы, которые передаются другой команде cmd, например так:

cmd -f "/foo bar" -f "/abc"

Я пробовал это

cmd $(find-files | sed 's/^/-f /')

Но он передает пути, содержащие пробел, как несколько аргументов.

, и если я цитирую подстановку, вся строка передается как один аргумент.

Какой правильный способ сделать это?

Кстати, это не тот вопрос, который задал здесь , в котором предлагалось eval. eval совсем не помогает с заполнением пробелов.

Ответы [ 2 ]

2 голосов
/ 05 февраля 2020

Используйте al oop для создания необходимого массива.

while IFS= read -r fname; do
  args+=(-f "$fname")
done < <(find-files)

cmd "${args[@]}"

Предполагается, что имена файлов не могут содержать символы новой строки, так как read будет рассматривать такие файлы как последовательные имена файлов, а не одно имя. Непонятно, является ли это проблемой для вас, или ваша команда find-files может предоставить безопасную альтернативу (например, вывести разделенный нулями список имен файлов, а не строк).

0 голосов
/ 04 февраля 2020

Поместите все ваши имена файлов в массив.

lst=( "/foo bar" /abc ) # quote as necessary

Затем используйте printf, чтобы вставить -f.

cmd $( printf ' -f "%s"' "${lst[@]}" ) # leading space helps

Например,

$: echo $( printf ' -f "%s"' "${lst[@]}" )
-f "/foo bar" -f "/abc"

Начальный пробел перед -f немного упрощается.
Без него вы получаете:

$: echo $( printf '-f %s' "${lst[@]}" )
bash: printf: -f: invalid option
printf: usage: printf [-v var] format [arguments]

РЕДАКТИРОВАТЬ:

Добавлены двойные кавычки в формате printf.

...