1
$ cat foo
foo
bar

Теперь, если я сделаю:

$ some_program foo

Работает.

Но если я попробую:

$ cat foo | some_program

Это не работает.

Я ищу чистый способ передачи ввода в some_program без использования грязных временных файлов.

3 ответа3

2

Трубопровод помещает стандартный вывод cat foo в стандартный some_program . В этом случае some_program ожидает аргумент, а не stdin, поэтому вы захотите сохранить результат cat foo в переменную и затем вызвать some_program $variable .

Я не слишком уверен в сценарии Bash, но попробовать это?

bar=`cat foo`
some_program $bar

На самом деле, может быть, это будет работать ...

some_program `cat foo`
2

В bash вы можете использовать процесс подстановки

$ some_program <(cat foo)

Таким образом, вы можете добавить столько параметров, сколько захотите, при условии, что вы знаете, что эти параметры будут именами файлов, которые будут доступны только для чтения. Вы не можете читать и писать одновременно.

2

Помимо способа, предложенного @Bob, есть еще один, более гибкий метод: xargs:

Вы могли бы использовать

cat foo | xargs some_program

который в основном эквивалентен

some_program `cat foo`

Если программа ожидает только один аргумент за раз, вы можете сделать

cat foo | xargs -n 1 some_program

И some_program будет вызываться один раз для каждой строки ввода.

Существует много других опций для xargs , например, осторожная обработка "плохих" имен файлов (с пробелами и другими специальными символами), ограничение количества одновременно запущенных процессов и т.д., Которые можно найти на странице руководства.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .