стенограма для подачі вмісту декількох файлів до строку сценарію


20

Скажімо, у мене є сценарій під назвою script, який читає з stdinі висилає на екран деякі результати.

Якби я хотів передати його вмістом одного файлу, я б набрав:

$ ./script < file1.txt

Але що робити, якщо я хочу подати вміст кількох файлів до сценарію однаково, чи це взагалі можливо? Найкраще, що я придумав поки що:

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

Який використовує дві команди та створює тимчасовий файл. Чи є спосіб зробити те ж саме, але обійти створення комбінованого файлу?


Перейдіть на zshі ви зможете запустити cmd <file1 <file2 ... <fileN;)
don_crissti

Відповіді:


20

Можна використовувати catі трубу:

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

Ваш приклад, використовуючи трубу, а не тимчасовий файл:

join file1.txt file2.txt | ./script

D'oh. Це так просто, що я навіть не впевнений, як я сам цього не усвідомив. Спасибі!
0x4B1D

10
Корисне використання нагороди кота!
glenn jackman

4
@Bruce Ediger: Я припускаю, що ви просто вказували спосіб використання joinбез тимчасового файлу, але просто для того, щоб зрозуміти читачеві: cat f1 f2не дає такого ж виходу, якjoin f1 f2
Peter.O

@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він сам йому не потрібен, тому що він робить те, що робить, об'єднує файли, віртуальні чи реальні.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.