сокращение для подачи содержимого нескольких файлов в stdin скрипта

20

Допустим, у меня есть скрипт script, который читает stdinи выводит некоторые результаты на экран.

Если бы я хотел передать ему содержимое одного файла, я бы набрал:

$ ./script < file1.txt

Но что, если я хочу передать содержимое нескольких файлов в сценарий одинаково, возможно ли это вообще? Лучшее, что я придумал, было:

cat file1.txt file2.txt > combined.txt && ./script < combined.txt

Который использует две команды и создает временный файл. Есть ли способ сделать то же самое, но в обход создания объединенного файла?

0x4B1D
источник
Переключитесь на, zshи вы сможете бежать cmd <file1 <file2 ... <fileN;)
don_crissti

Ответы:

20

Вы можете использовать catи трубу:

cat file1 file2 file3 ... fileN | ./script

Ваш пример с использованием канала и без временного файла:

join file1.txt file2.txt | ./script
Брюс Эдигер
источник
D'о. Это так просто, я даже не уверен, как я сам этого не осознал. Благодарность!
0x4B1D
10
Полезное использование награды кошки!
Гленн Джекман
4
@ Брюс Эдигер: Я предполагаю, что вы просто указали способ использования joinбез временного файла, но просто чтобы прояснить это для читателя: cat f1 f2не join f1 f2
выдает
@fred спасибо за указание на это - я использовал joinв своем примере, потому что я играл с ним раньше; на самом деле, для моего примера я использовал cat.
0x4B1D
10

Если вы не хотите использовать канал, вы можете использовать перенаправление ввода с подстановкой процесса:

./script <(cat file1 file2)
Иона Браун
источник
3

Чтобы добавить ответ @Jonah Braun, если вам когда-либо понадобится добавить вывод процесса в ваш скрипт, то есть ваш файл может быть не на вашем диске, а доступ к нему осуществляется с URLпомощью curlили подобного инструмента.

Нечто подобное можно использовать для получения stdoutнескольких процессов и использования их в сценарии с помощьюstdin

Это будет скрипт для обработки ввода. Содержимое multi-input.sh:

#!/usr/bin/env bash
while read line; do
    echo $line
done

Теперь проверьте это:

$ ./multi-input.sh < <(cat <(echo process 1) <(echo process 2) <(echo process 3))

Выход:

process 1
process 2
process 3

<()превращает процесс в виртуальное fileиспользование, fdесли хотите, поэтому <необходимо прочитать его. catСамо по себе это не нужно, потому что оно делает то, что делает, объединяет файлы, виртуальные или реальные.

sdkks
источник