Mevcut ödül bildirimindeki soru:
genel örnek çok karmaşıktır. Birisi lütfen aşağıdaki örneğin nasıl uygulanacağını açıklayabilir mi?diff <(cat "$2" | xz -d) <(cat "$1" | xz -d)
burada bir cevap var gibi görünüyor .
Gilles'in cevabında gösterildiği gibi , genel fikir, "üretici" komutlarının çıktısını , bir boru hattının farklı aşamalarında yeni cihaz dosyalarına ( 1) göndermek ve bunları, dosya adlarını bağımsız değişken olarak alabilecekleri "tüketici" komutları için kullanılabilir hale getirmektir ( sisteminizin size dosya tanımlayıcılarına erişim izni verdiği varsayılarak /dev/fd/X
)
Aradığınızı elde etmenin en basit yolu muhtemelen:
xz -cd file1.xz | { xz -cd file2.xz | diff /dev/fd/3 -; } 3<&0
(Kullanma file1.xz
yerine "$1"
okunabilmesi için ve xz -cd
yerine cat ... | xz -d
tek bir komut yeterli olduğu için).
Birinci "üretici" komutunun çıktısı, xz -cd file1.xz
bir bileşik komutuna ( {...}
) bağlanır ; ancak, bir sonraki komutun standart girdisi olarak hemen tüketilmek yerine, dosya tanımlayıcısına çoğaltılır3
ve böylece bileşik komutunun içindeki her şeye erişilebilir olur /dev/fd/3
. xz -cd file2.xz
Ne standart girdisini ne de dosya tanımlayıcısından herhangi bir şeyi tüketmeyen ikinci "üretici" komutunun çıktısı 3
, daha sonra diff
standart girdisinden ve okunan "tüketici" komutuna bağlanır /dev/fd/3
.
Borulama ve dosya tanımlayıcı çoğaltması, gerektiği kadar "üretici" komutu için aygıt dosyaları sağlamak amacıyla eklenebilir, örn:
xz -cd file1.xz | { xz -cd file2.xz | { diff /dev/fd/3 /dev/fd/4; } 4<&0; } 3<&0
Sorunuz bağlamında alakasız olsa da, şunu belirtmek gerekir:
cmd1 <(cmd2) <(cmd3)
, cmd2 | { cmd3 | { cmd1 /dev/fd/3 /dev/fd/4; } 4<&0; } 3<&0
Ve ( cmd2 | ( cmd3 | ( cmd1 /dev/fd/3 /dev/fd/4 ) 4<&0 ) 3<&0 )
ilk yürütme ortamında farklı potansiyel etkileri vardır.
Olur aksine cmd1 <(cmd2) <(cmd3)
, cmd3
ve cmd1
de cmd2 | { cmd3 | { cmd1 /dev/fd/3 /dev/fd/4; } 4<&0; } 3<&0
kullanıcıdan herhangi bir giriş okumak mümkün olmayacaktır. Bunun için daha fazla dosya tanımlayıcı gerekir. Örneğin,
diff <(echo foo) <(read var; echo "$var")
gibi bir şeye ihtiyacın olacak
{ echo foo | { read var 0<&9; echo "$var" | diff /dev/fd/3 -; } 3<&0; } 9<&0
1 Bunlarla ilgili daha fazla bilgiyi U&L'de bulabilirsiniz, örn. Anlama / dev ve alt dizinleri ve dosyaları .