3> & 1 4> & 3 5> & 3 vb. Anlamına mı geliyor?


31

Beklerdim

echo foo | tee /proc/self/fd/{3..6} 3>&1

/ proc / self / fd / 4 gibi hatalarla başarısız olmak : Böyle bir dosya veya dizin vb. yok, ancak sürpriz olarak çıktı

foo
foo
foo
foo
foo

Bu, 3>&1aşağıdaki tüm tanımlayıcıların stdout'a yönlendirilmesine neden olur, ancak 3başka bir şeye değiştirirsem işe yaramaz.

$ echo foo | tee /proc/self/fd/{3..6} 4>&1
tee: /proc/self/fd/3: No such file or directory
tee: /proc/self/fd/5: No such file or directory
tee: /proc/self/fd/6: No such file or directory
foo
foo
$ echo foo | tee /proc/self/fd/{4..6} 4>&1
tee: /proc/self/fd/5: No such file or directory
tee: /proc/self/fd/6: No such file or directory
foo
foo

Bu davranış için bir açıklama var mı?

Yanıtlar:


31

strace sistem çağrılarının bu sırasını gösterir:

$ strace -o strace.log tee /proc/self/fd/{3..6} 3>&1
...
$ cat strace.log
...
openat(AT_FDCWD, "/proc/self/fd/3", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 4
openat(AT_FDCWD, "/proc/self/fd/4", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 5
openat(AT_FDCWD, "/proc/self/fd/5", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 6
openat(AT_FDCWD, "/proc/self/fd/6", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 7
...

İlk satır açılır /proc/self/fd/3ve bir sonraki kullanılabilir fd numarasını atar /proc/self/fd/3. 4. özel bir yoldur. Bu benzer bir etkiye sahiptir açma DUP ing 3 fd: fd 3 TTY aynı yere 4 puan fd.

Aynı şey birbirini izleyen her openat()çağrı için de geçerlidir. Toz fds 4, 5, 6 ve 7 çöktüğünde hepsi fd 3'ün kopyalarıdır.

  • 1 → tty
  • 3 → tty
  • 4 → tty
  • 5 → tty
  • 6 → tty
  • 7 → tty

Yeniden 3>&1yönlendirmenin önemli olmadığını unutmayın . Önemli olan tee'den N'nin kullanımda /proc/self/fd/Nolduğu yeri açmasını istiyoruz . Eğer kurtulur 3>&1ve /proc/self/fd/2bunun yerine tee start alırsak aynı sonucu almalıyız . Bakalım:

$ echo foo | tee /proc/self/fd/{2..6}
foo
foo
foo
foo
foo
foo

Onaylanmış! Aynı sonuç.

Aynı fd numarasını defalarca tekrarlayabiliriz. Fd 6'ya bastığımızda da aynı sonucu alırız. Sonuncusuna ulaştığında, 6'ya atlamayı mümkün kılacak kadar tanımlayıcı açtı.

$ echo foo | tee /proc/self/fd/{2,2,2,2,6}
foo
foo
foo
foo
foo
foo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.