Hem de
<file.txt tee >(grep LITERAL) >(wc -l) >/dev/null
Ve:
{ { <file.txt tee /dev/fd/3 | grep LITERAL >&4; } 3>&1 | wc -l ;} 4>&1
Tüm tee
, grep
ve wc
eş zamanlı olarak başlatılır. O zaman önemli olan sonunda ne olacağı.
wc
sonucu yalnızca standart girdisinde dosya sonu gördüğünde yazdırır. İlk durumda, o zaman tee
çıkışlar, çünkü o tee
zaman okunan fd
borunun diğer ucunda kapatacaktır wc
(işlem ikamesi ile başlar). grep
Çıktısını yazılı olarak bırakın, o zamana kadar tüm girdilerini okuyacak bir garanti yoktur (boruların oldukça fazla miktarda veri tutabileceği ve wc
muhtemelen daha hızlı olacağı göz önüne alındığında grep
)
İkinci durumda, wc
okuduğu boruya giden tüm yazarlar borunun ucunu kapattıklarında dosya sonu görecektir. Bu durumda yine de birkaç yazar var. tee
( /dev/fd/3
fd 3 üzerinden ve fd 3 üzerinden) ve grep
aynı zamanda fd
3'ü boruya açık olan wc
(herhangi bir şekilde kullanılmasa da, yazmama izin verin). İç kısım {
muhtemelen fd
3 açık olacak tee
ve hem de hem de bekleyecek ekstra bir alt kabuk işlemine neden olacaktır grep
.
Bu wc
, satır numarasını ancak grep
çıktıktan sonra yazacağı anlamına gelir .
Doğru şekilde yazmış olsaydınız, yani açık olması gerekmeyen fds'leri kapatarak:
{ { <file.txt tee /dev/fd/3 4>&- |
grep LITERAL >&4 3>&- 4>&-; } 3>&1 | wc -l 4>&-;} 4>&1
O zaman sipariş, alt kabuk sürecini optimize eden mermilerde garanti edilmezdi. Ancak, bildiğim tek kabuk borular için soket çiftlerini kullanıyor , ksh93
ancak en azından orada Linux'ta çalışmayacak.ksh93
/dev/fd/3
, Değiştirmek ne süreçleri çalıştıran görmek için grep
ile ps
:
$ { { <file.txt tee /dev/fd/3 4>&- | ps -H >&4 3>&- 4>&-; } 3>&1 | wc -l 4>&-;} 4>&1
PID TTY TIME CMD
8727 pts/5 00:00:00 bash
8815 pts/5 00:00:00 bash
8817 pts/5 00:00:00 tee
8818 pts/5 00:00:00 ps
8816 pts/5 00:00:00 wc
İle bash
, ekstra kabuk işlemini görebilir ve fd 3'te borunun da açıldığını görebilirsiniz:
$ (p=$BASHPID; { { <file.txt tee /dev/fd/3 4>&- | lsof -ag "$p" -d3 >&4 3>&- 4>&-; } 3>&1 | wc -l 4>&-;} 4>&1)
COMMAND PID PGID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 9843 9842 chazelas 3w FIFO 0,8 0t0 153304 pipe
tee 9845 9842 chazelas 3w FIFO 0,8 0t0 153304 pipe
lsof 9846 9842 chazelas 3r DIR 0,3 0 1 /proc
grep LITERAL >&4 3>&- 4>&-
demek, fd 4 hem kullanılmış hem de kapalı görünüyor?