2 tmp dosyası içeren bir satır (istediğinizi değil):
foo | bar > file1.txt && baz | quux > file2.txt && diff file1.txt file2.txt
Bash ile deneyebilirsiniz:
diff <(foo | bar) <(baz | quux)
foo | bar | diff - <(baz | quux) # or only use process substitution once
İkinci sürüm , iki numaralı fds yerine,
-- /dev/stdin
vs ++ /dev/fd/63
veya bir şey göstererek hangi girdinin olduğunu hatırlatacaktır .
Dosya sisteminde adlandırılmış bir boru bile görünmez, en azından bash /dev/fd/63
, komutun ayarlayabileceği zaten açık olan bir dosya tanımlayıcısından gerçekten okumak için açılabileceği ve okunabileceği bir dosya adı almak gibi dosya adlarını kullanarak işlem ikamesi uygulayabileceği işletim sistemlerinde görünür. komutunu çalıştırmadan önce yukarı kaldırın. (yani bash pipe(2)
çataldan önce kullanır ve daha sonra dup2
çıktısından fd 63 quux
için bir giriş dosyası tanımlayıcısına yönlendirir. diff
)
Bulunan bir sistemde hiçbir "sihirli" /dev/fd
ya /proc/self/fd
, bash işlemi ikame uygulamak için adlandırılmış yöneltme kullanmak olabilir, ama en azından geçici dosyaları aksine onları kendisi yönetmek ve verileriniz dosya sistemine yazılabilir olmaz.
echo <(true)
Dosya adını yazdırmak yerine bash'ın işlem ikamesini nasıl uyguladığını kontrol edebilirsiniz . /dev/fd/63
Tipik bir Linux sistemine yazdırır . Veya tam olarak hangi sistem çağrılarının kullandığı hakkında daha fazla bilgi için, bir Linux sistemindeki bu komut dosya ve dosya tanımlayıcı sistem çağrılarını izler
strace -f -efile,desc,clone,execve bash -c '/bin/true | diff -u - <(/bin/true)'
Bash olmadan, adlandırılmış bir boru yapabilirsiniz . Kullan -
anlatmak için diff
STDIN'den bir giriş okumak ve diğer olarak adlandırılan boru kullanımı:
mkfifo file1_pipe.txt
foo|bar > file1_pipe.txt && baz | quux | diff file1_pipe.txt - && rm file1_pipe.txt
Not o yapabilirsiniz sadece boru tek çıkış için birden girdiler tee komutuyla:
ls *.txt | tee /dev/tty txtlist.txt
Yukarıdaki komut ls * .txt dosyasının terminale çıkışını görüntüler ve txtlist.txt metin dosyasına verir.
Ancak işlem ikamesi ile tee
aynı verileri birden fazla boru hattına beslemek için kullanabilirsiniz :
cat *.txt | tee >(foo | bar > result1.txt) >(baz | quux > result2.txt) | foobar
mkfifo a; cmd >a& cmd2|diff a -; rm a