Передача файла в команду, которая не реализует передачу

1
$ cat foo
foo
bar

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

$ some_program foo

Работает.

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

$ cat foo | some_program

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

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

ms123
источник

Ответы:

2

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

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

bar=`cat foo`
some_program $bar

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

some_program `cat foo`
боб
источник
Ты лучший!
ms123
ms123: Пожалуйста, измените ваш вопрос, если вы искали аргументы командной строки из файла вместо имени файла. Исходя из вашего текущего вопроса, это совсем другое
Cougar
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, таких как тщательная обработка «плохих» имен файлов (с пробелами и другими специальными символами), ограничение количества одновременно запущенных процессов и т. Д., Которые можно найти на странице руководства.

земля
источник