Сервер Linux в качестве цели для моего кода C [закрыто]

Без xargs

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

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

Ограничение : это подвергает вывод 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 установлен на символ новой строки, вывод разбивается на строки. Затем оболочка выполняет расширение имени пути . Поскольку есть файлы, соответствующие глобусу 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*'
0
04.07.2015, 12:48
0 ответов

Теги

Похожие вопросы