И, если я правильно понял вопрос, xargs ведь тоже подойдет. Те
Код: Выделить всё
$ cat ./t.py
#!/usr/bin/env python
import sys
print len(sys.argv)
print str(sys.argv)
$ echo a b c | xargs ./t.py
4
['./t.py', 'a', 'b', 'c']
Но, обратите внимание, что xargs по дефолту:
- использует blank (те новая строка, пробел и, наверно, табуляция) для разделения аргументов в stdin.
- интерпретирует
эскейп-последовательности обратный слеш, одинарные и двойные кавычки.
Чтобы это отключить, вы должны указать разделитель аргументов явно, например, так:
Несколько примеров есть тут
xargs, arguments separator and escapes. .
Upd. Небольшое исправление.
Upd2.
Вот еще пример:
Код: Выделить всё
$ echo \'a b\' c d | xargs ./t.py
4
['./t.py', 'a b', 'c', 'd']
здесь кавычки интерпретируются. А здесь нет:
Код: Выделить всё
$ echo \'a b\' c d | xargs -d'\n' ./t.py
2
['./t.py', "'a b' c d"]
Или, если нужно не интерпретировать кавычки и оставить разделителем пробел, то можно так:
Код: Выделить всё
$ echo \'a b\' c d | xargs -d' ' ./t.py
5
['./t.py', "'a", "b'", 'c', 'd\n']
Upd3.
Еще хотел бы обратить ваше внимение на всякий случай на разделение вывода команды после command substitution.
Если command substitution написано не в двойных кавычках, после него выполняется word splitting и pathname expansion. Те результат $() будет разделен на слова по символоам IFS (это word splitting), а затем спецсимолы типа * могут быть заменены на имена файлов в текущем каталоге (это pathname expansion):
Код: Выделить всё
$ ls
a.txt t.py
$ ./t.py $(echo 'b a*')
3
['./t.py', 'b', 'a.txt']
Соответственно, если pathname expansion вам не нужен, вы можете отключить его, включив опцию оболочки '-f' ('noglob'):
Код: Выделить всё
$ ( set -f; ./t.py $(echo 'b a*') )
3
['./t.py', 'b', 'a*']
Если же пробел присутствует в самих аргументах (те по нему разделять вывод команды не надо), вы можете убрать его из IFS. Например, установив IFS в "новую строку":
Код: Выделить всё
$ ( set -f; IFS=$'\xa'; ./t.py $(echo 'b a*') )
2
['./t.py', 'b a*']
Последний пример работает только в bash. Для sh замените $'\xa' на настоящую новую строку в кавычках:
Если же command substitution написан в кавычках, его результат всегда будет одним словом (ни word splitting, ни pathname expansion выполняться не будут):
Код: Выделить всё
$ ./t.py "$(echo 'b a*')"
2
['./t.py', 'b a*']