ksh93
tipik olarak bu tür şeyler için kullanılan disiplinlere sahiptir. İle zsh
, dinamik adlı dizin özelliğini ele geçirebilirsiniz :
Örneğin tanımlayın:
zsh_directory_name() {
case $1 in
(n)
case $2 in
(incr) reply=($((++incr)))
esac
esac
}
Ve sonra her seferinde ~[incr]
bir artış elde etmek için kullanabilirsiniz $incr
:
$ echo ~[incr]
1
$ echo ~[incr] ~[incr]
2 3
Yaklaşımınız başarısız olur, çünkü head -1 /tmp/ints
kafa, fifoyu açar, tam bir arabelleği okur, bir satır yazdırır ve sonra kapatır . Kapandıktan sonra yazı ucu kırık bir boru görür.
Bunun yerine, şunları yapabilirsiniz:
$ fifo=~/.generators/incr
$ (umask 077 && mkdir -p $fifo:h && rm -f $fifo && mkfifo $fifo)
$ seq infinity > $fifo &
$ exec 3< $fifo
$ IFS= read -rneu3
1
$ IFS= read -rneu3
2
Orada, okuma ucunu fd 3'te açık bırakıyoruz ve read
tam olarak bir satırı (yeni satır karakterine kadar) okuduğunuzdan emin olmak için tam bir arabellek değil, bir seferde bir bayt okuyoruz.
Veya şunları yapabilirsiniz:
$ fifo=~/.generators/incr
$ (umask 077 && mkdir -p $fifo:h && rm -f $fifo && mkfifo $fifo)
$ while true; do echo $((++incr)) > $fifo; done &
$ cat $fifo
1
$ cat $fifo
2
O zaman, her değer için bir boru başlatırız. Bu, herhangi bir rasgele sayıda satır içeren verilerin döndürülmesine izin verir.
Bununla birlikte, bu durumda, cat
fifo açılır açılmaz echo
ve döngü engellenmez, böylece içeriği okuyarak ve boruyu kapatıncaya kadar daha fazlası echo
çalıştırılabilir cat
(bir sonrakinin echo
yeni bir boru başlatmasına neden olur ).
Bir çözüm, örneğin echo
@jimmij tarafından önerildiği gibi bir harici çalıştırma veya biraz ekleme gibi bir gecikme eklemek olabilir sleep
, ancak yine de çok sağlam olmaz veya her birinden sonra adlandırılmış boruyu yeniden oluşturabilirsiniz echo
:
while
mkfifo $fifo &&
echo $((++incr)) > $fifo &&
rm -f $fifo
do : nothing
done &
Hala (arasındaki boru yok kısa pencereleri bırakır unlink()
yapılır rm
ve mknod()
yapılır mkfifo
neden olan) cat
başarısız olmasına ve aralarında (boru örneği olmuştur ama hiçbir işlem hiç ona tekrar yazacak çok kısa pencereler write()
ve close()
tarafından yapılan echo
yol açan) cat
adlandırılmış kanal yayınlanmaya devam ederken arasındaki hiçbir şey (yazma için açacağız nereye hiçbir şey dönmek ve kısa pencereler close()
yapılır echo
ve unlink()
yapılır rm
nerede) cat
askıda.
Bu pencerelerden bazılarını şöyle yaparak kaldırabilirsiniz :
fifo=~/.generators/incr
(
umask 077
mkdir -p $fifo:h && rm -f $fifo && mkfifo $fifo &&
while
mkfifo $fifo.new &&
{
mv $fifo.new $fifo &&
echo $((++incr))
} > $fifo
do : nothing
done
) &
Bu şekilde, tek sorun aynı anda birden fazla kedi çalıştırırsanız (hepsi yazma döngüsünü yazmak için açmaya hazır olmadan önce fifo'yu açarlar), bu durumda echo
çıktıyı paylaşacaklardır .
Ayrıca /tmp
, sistemdeki tüm kullanıcılara açık bir hizmet olmadıkça , dünya çapında yazılabilir dizinlerde sabit ad, dünya tarafından okunabilir fifos (veya bu konuda herhangi bir dosya) oluşturmaya karşı öneriyorum .