использовать строки в качестве аргументов в одном вызове (xargs-like)

У меня есть одна функция, которая печатает несколько строк, которые я хочу использовать в качестве аргументов для другой функции:

lsx() { echo 1 is one echo 2 are two } somefun() { for arg in "$@"; do echo "arg='$arg'" done } 

Как я могу «элегантно» называть somefun() строками из lsx() качестве аргументов?

То, что я делаю сейчас, это петлевые строки, использующие while , сохраняя строки в массиве, но это кажется уродливым и способным работать. (Edit: Это не работает из-за while + subhell). Я думаю, что должен быть простой (даже переносимый) способ, но он не может придумать его.

(Если somefun был внешней командой, тогда я бы просто использовал xargs, но это не так.)

2 Solutions collect form web for “использовать строки в качестве аргументов в одном вызове (xargs-like)”

Без xargs

 $ ( IFS=$'\n'; somefun $(lsx) ) arg='1 is one' arg='2 are two' 

Подоболочка используется так, что изменение IFS является локальным, а не глобальным.

Ограничение : это lsx на lsx расширения lsx на путь, который может быть или не быть проблемой.

С помощью xargs

Чтобы получить доступ к командной оболочке с помощью xargs, нам нужно запустить оболочку. Чтобы иметь доступ к somefun в дочерней оболочке, нам нужно сначала его экспортировать. Таким образом:

 $ export -f somefun $ lsx | xargs -d'\n' bash -c 'somefun "$@"' SomeFun arg='1 is one' arg='2 are two' 

Первый аргумент bash присваивается $0 и служит в качестве имени программы в сообщениях об ошибках. Это может быть произвольное слово. Здесь мы используем SomeFun .

Примеры проблем с расширением пути

 $ lsx() { echo '1 is one*'; echo '2 are two*'; } $ touch '1 is one'{1..3} two{a..c} $ ( IFS=$'\n'; somefun $(lsx) ) arg='1 is one1' arg='1 is one2' arg='1 is one3' arg='2 are two*' 

Как вы видите, первая строка вывода была расширена на три строки.

Сначала оболочка выполняет разбиение слов на выходе $(lsx) . Поскольку IFS установлен на символ новой строки, вывод разбивается на строки. Затем оболочка выполняет расширение пути . Поскольку есть файлы, которые соответствуют glob 1 is one* , этот glob расширяется в список этих имен. В нашем примере нет файлов, которые соответствуют glob 2 is two* и, следовательно, glob не расширяется. (В соответствии с IFS по умолчанию 2 is two* которые были бы разделены на три слова, а третий соответствовал файлам twoa , twoc и twoc .)

Подход xargs позволяет избежать расширения пути:

 $ export -f somefun $ lsx | xargs -d'\n' bash -c 'somefun "$@"' SomeFun arg='1 is one*' arg='2 are two*' 

Простое решение:

 IFS=" " somefun $(lsx) 
  • Передача команды git в качестве аргумента
  • Bash, если утверждение не работает должным образом
  • Как передать содержимое файла в качестве параметра командной строки
  • Когда и как была введена двойная тире (-) в качестве разделителя опций в Unix / Linux?
  • Создание md5sum для понимания имен файлов с пробелами
  • функция bash для переноса программы и иногда добавить аргумент
  • Создание аргумента в unix
  • Различные способы передачи аргументов консольным приложениям
  • Использование параметров в скрипте
  • Как можно выполнить команду с неизвестным числом аргументов в оболочке POSIX?
  • Передача аргументов из одной команды в следующую
  • Linux и Unix - лучшая ОС в мире.