birden çok dosyanın içeriğini bir komut dosyasının standartlarına beslemek için kısayol


20

Diyelim ki , ekranda bazı sonuçlar scriptokuyan stdinve bazı sonuçları veren bir senaryom var .

Bir dosyanın içeriğini beslemek isteseydim, şunu yazardım:

$ ./script < file1.txt

Ancak, birden çok dosyanın içeriğini betiğe aynı şekilde beslemek istersem, bu mümkün mü? Şimdiye kadar geldi en iyi oldu:

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

Hangi iki komut kullanır ve bir geçici dosya oluşturur. Aynı şeyi yapmanın ancak birleştirilmiş dosyayı oluşturmayı atlamanın bir yolu var mı?


Geçin zshve çalıştırmak mümkün olacak cmd <file1 <file2 ... <fileN;)
don_crissti

Yanıtlar:


20

catBir boru kullanabilirsiniz :

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

Pipo kullanarak ve geçici dosya içermeyen örneğiniz:

join file1.txt file2.txt | ./script

D'oh. O kadar basit ki, bunu kendim nasıl gerçekleştirmediğimden bile emin değilim. Teşekkürler!
0x4B1D

10
Kedi ödülünün yararlı kullanımı!
glenn jackman

4
@Bruce Ediger: Sadece joingeçici bir dosya olmadan kullanmanın bir yolunu işaret ettiğinizi varsayıyorum , ama sadece okuyucuya açıklamak için: cat f1 f2ile aynı çıktıyı join f1 f2
üretmiyor

@fred bunu işaret ettiğiniz için teşekkürler - Örneğimde kullandım joinçünkü daha önce onunla oynuyordum; gerçekte, benim örneğim için kullanıyordum cat.
0x4B1D

10

Bir boru kullanmak istemiyorsanız, işlem yönlendirmeyle giriş yeniden yönlendirmeyi kullanabilirsiniz:

./script <(cat file1 file2)

3

@Jonah Braun'un cevabına eklemek için, betiğinize de süreç çıktısı eklemeniz gerekiyorsa, yani dosyanız diskinizde olmayabilir, ancak benzer bir araç URLkullanılarak erişilebilir curl.

Bunun gibi bir şey stdout, birden fazla işlem almak ve bunları bir komut dosyasında kullanmak için kullanılabilir.stdin

Bu girdi işleyecek komut dosyası olacaktır İçeriği multi-input.sh:

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

Şimdi test edin:

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

Çıktı:

process 1
process 2
process 3

<()Eğer istersen filekullanarak sanal bir süreç haline getirir fd, bu yüzden <okumak için gereklidir. catkendisi buna ihtiyaç duymaz, çünkü yaptığı şeyi yapar, sanal veya gerçek dosyaları birleştirir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.