ksh93tipik 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/intskafa, 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 readtam 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, catfifo açılır açılmaz echove döngü engellenmez, böylece içeriği okuyarak ve boruyu kapatıncaya kadar daha fazlası echoçalıştırılabilir cat(bir sonrakinin echoyeni 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 rmve mknod()yapılır mkfifoneden olan) catbaş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 echoyol açan) catadlandı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 echove unlink()yapılır rmnerede) cataskı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 .