$ ( IFS=$'\n'; somefun $(lsx) )
arg='1 is one'
arg='2 are two'
Подоболочка используется так, чтобы изменение на IFS
было локальным, а не глобальным.
Ограничение : это подвергает вывод lsx
расширению имени пути, что может быть или не быть проблемой.
Чтобы получить доступ к функции оболочки с помощью 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 установлен на символ новой строки, вывод разбивается на строки. Затем оболочка выполняет расширение имени пути . Поскольку есть файлы, соответствующие глобусу 1 равно одному *
, этот глоб расширяется до списка этих имен. В нашем примере нет файлов, соответствующих глобусу 2 is two *
, поэтому этот глобус не раскрывается. (При IFS по умолчанию 2 равно двум *
было бы разделено на три слова, а третье соответствовало бы файлам twoa
, twob
и ] twoc
.)
Подход xargs
позволяет избежать расширения имени пути:
$ export -f somefun
$ lsx | xargs -d'\n' bash -c 'somefun "$@"' SomeFun
arg='1 is one*'
arg='2 are two*'