$ cat foo
foo
bar
Теперь, если я сделаю:
$ some_program foo
Работает.
Но если я попробую:
$ cat foo | some_program
Это не работает.
Я ищу чистый способ передачи ввода в some_program
без использования грязных временных файлов.
$ cat foo
foo
bar
Теперь, если я сделаю:
$ some_program foo
Работает.
Но если я попробую:
$ cat foo | some_program
Это не работает.
Я ищу чистый способ передачи ввода в some_program
без использования грязных временных файлов.
Трубопровод помещает стандартный вывод cat foo
в стандартный some_program
. В этом случае some_program
ожидает аргумент, а не stdin, поэтому вы захотите сохранить результат cat foo
в переменную и затем вызвать some_program $variable
.
Я не слишком уверен в сценарии Bash, но попробовать это?
bar=`cat foo`
some_program $bar
На самом деле, может быть, это будет работать ...
some_program `cat foo`
В bash вы можете использовать процесс подстановки
$ some_program <(cat foo)
Таким образом, вы можете добавить столько параметров, сколько захотите, при условии, что вы знаете, что эти параметры будут именами файлов, которые будут доступны только для чтения. Вы не можете читать и писать одновременно.
Помимо способа, предложенного @Bob, есть еще один, более гибкий метод: xargs
:
Вы могли бы использовать
cat foo | xargs some_program
который в основном эквивалентен
some_program `cat foo`
Если программа ожидает только один аргумент за раз, вы можете сделать
cat foo | xargs -n 1 some_program
И some_program
будет вызываться один раз для каждой строки ввода.
Существует много других опций для xargs
, например, осторожная обработка "плохих" имен файлов (с пробелами и другими специальными символами), ограничение количества одновременно запущенных процессов и т.д., Которые можно найти на странице руководства.