2012-04-14 14 views
8

Yapabileceğiniz: '> & 0' (stdin'e yönlendirmek) için kullanım var mı? Bash olarak

  • echo test >&1

  • echo test >&2

(stderr'e yönlendir)

  • echo test >&0 (stdin'e yönlendirme) (zaten orada oluyor rağmen, Stdout'a yönlendir) Sonuncuyu yaptığımda, terminalim hala diğer ikisi ile olduğu gibi test'u yazdırıyor, ancak nedenini bilmek zor. İlk önce neden bu hiç işe yaramıyor? İkinci olarak, stdin yönlendirme için iyi bir kullanım var mı?

  • cevap

    6

    >&0, >&0'un dosya tanımlayıcısı 0 olarak yinelenen dosya tanımlayıcısı 1 olmasını sağlar. Eğer programın stdin'i yalnızca okuma için açıksa, programınız stdout'a (dosya tanıtıcısı 1) yazmaya çalıştığında Bir hata çünkü dosya tanıtıcı 1 sadece okumak için açıktır.

    10156115.sh:

    #!/bin/bash 
    bash -c 'ls -l /proc/$$/fd' >&0 
    

    Sonra tanımlanabilir Stdin, stdout ve stderr ile çağırmak:

    Bunu kendi dosya tanımlayıcıları inceler küçük kabuk programlar yazarak bunu gösterebilir

    $ touch stdin 
    $ ./10156115.sh <stdin> stdout 2> stderr 
    

    sonuç almak olduğunu stderr aşağıdaki:

    ls: write error: Bad file descriptor 
    

    Ancak varsayılan olarak, her üç bir terminal gibidir: (çıkış basitleştirilmiş)

    $ ls -l /proc/$$/fd 
    lrwx------ 0 -> /dev/pts/14 
    lrwx------ 1 -> /dev/pts/14 
    lrwx------ 2 -> /dev/pts/14 
    lrwx------ 255 -> /dev/pts/14 
    

    Tipik olarak, her üç aslında açık okuma + yazma, bu nedenle tek başına kullanıldığında >&0 yönlendirme hiç bir etkisi yoktur normal bir kabuktan.


    Bunun için herhangi bir kullanım var mı?

    bunların hiçbirini yaygın kullanımları yoktur, ama herkese senaryonuz stdout ve stderr yönlendirmeleri çağırır ve sebebi ne olursa olsun sen değilsin için eğer terminale yazdırmak için bir yol almak için bir kirli hack olarak kullanabilir Bunu değiştirebiliriz:

    Bunu yapmayı kesinlikle tavsiye etmem.

    5

    Tarihsel nedenlerle, bir terminaldeki standart dosya tanıtıcıları salt okunur yerine açık okuma/yazma (özellikle, bir kez açıldı ve dup() diğerlerine verildi). Bu, bazen pipet girişi almak isteyenler için faydalıdır, fakat aynı zamanda /dev/tty'un kullanılması daha güvenilirdir, ancak kullanıcı girdisini (stdout veya daha sık olarak stderr) da okuyun. Bazı sistemler bunu sadece ttys'ten daha fazlasına uygular: * BSD'lerin çift yönlü açılabilir soketleri ("borular") ve bazı sistem yardımcı programları (bir örnek olarak ufsdump hatırlıyorum) buna bağlıdır.

    çoğu programlar o okumak için açık olmasını bekliyoruz çünkü (yani, sadece yazmak için açmak zorunda), genellikle yararlı değildir (ya da bazen yukarıdaki gibi okuma/yazma) stdin sayfasına yönlendiriliyorsunuz.

    İlgili konular