Bir dosya adı yerine kısa çizgi (-) kullanımı


110

Bir komut için, -bir dosya adı yerine bir argüman olarak kullanmak STDIN veya STDOUT anlamına gelir.

  1. Ancak bu örnekte, adında bir dosya oluşturur -:

    echo hello > -

    -Bu örnekte STDOUT anlamına nasıl gelebilirim?

  2. Tersine, örneklerdeki -bir dosyayı nasıl kastediyorum?-

    cat -

3
Anlaşılan, doğrudan yorum yapmak için 50 itibara sahip olmak zorunda olduğumdan ... / dev / stdin / dev / stdout yorumunda, meşru bir UNIX türevi olan AIX'in sözde maneviyatları yoktur. Ve bir başka yorum olarak, LINUX hiçbir durumda bir UNIX türevi değildir. POSIX uyumlu bir çalışma şeklidir ve bu noktada UNIX-ish OS'lerin en popüler olanıdır, ancak hata yapmayın, bu UNIX değil. Ancak, buradaki cevapların özü doğru. "-" notasyonu kabuk tarafından özel olarak yorumlanmaz ve bu nedenle doğrudan her bir uygulamaya doğrudan ARG olarak iletilir. Uygulama tanımıyorsa

Ayrıca 2>&-"yakın tanımlayıcı 2" anlamına gelen bir yapı var .
user3132194

@ user95873, söylemek istediğim şey şudur: Linux Unix benzeri iken, her Unix benzeri (veya gerçek UNIX) Linux değildir . Linux'un gerçek olup olmadığı veya UNIX olmadığı (yani Tek UNIX Belirtimi'ne uyduğu) meselesi / dev / std {in, out, err} sorunu ile ilişkili değildir. As / dev / std {in, out, err} özelliği eklenmemiş , eksik değil .
sasha

Yanıtlar:


156

-Stdin / stdout'u ifade etmek için dosya adı olarak kullanmak , pek çok programın kullandığı bir kuraldır. Dosya adının özel bir özelliği değil. Çekirdek -özel olarak tanınmaz , bu nedenle -dosya adı olarak adlandırılan herhangi bir sistem çağrısı dosya adı -olarak tam anlamıyla kullanılır .

Bash yönlendirmesi ile, -özel bir dosya adı olarak tanınmaz, bu nedenle bash bunu değişmez bir dosya adı olarak kullanır.

Ne zaman catdize gören -bir dosya adı olarak, stdin ile eşanlamlı olarak değerlendirir. Bunun üstesinden gelmek için, görünen bir dizeyi, catyine de adı verilen bir dosyaya gönderme yapacak biçimde değiştirmeniz gerekir -. Bunu yapmanın genel yolu, dosya ismini bir yol ile öneklendirmektir - ./-, veya /home/Tim/-. Bu teknik aynı zamanda komut satırı seçeneklerinin dosya adlarıyla çakıştığı benzer sorunları gidermek için kullanılır, bu nedenle örneğin bir program ./-eiçin -ekomut satırı seçeneği olarak görünmeyen bir dosya .


37
Bunu eklemek için değer /dev/stdinve /dev/stdoutevrensel olarak kullanılabilir ve -kongre yerine kullanılabilir .
jmtd

Ayrıca bu catdurumda, argümanı listelemek yerine yönlendirme kullanmak yardımcı olabilir cat <-:; ancak, bir kerede birden fazla dosyayı birleştirmekle karıştırmak ve eşleştirmek zor olacaktır.
jmtd

10
@jmtd: / dev / std {in, out} evrensel olarak uygun değildir. Tüm unixlerde yoktur.
camh

2
İlginç, POSIX'in bir parçası olduklarını varsaydım (ancak onaylayamıyorum). En azından Linux, BSD'ler ve Solaris'te mevcutlar. Onları olmayan modern bir UNIX örneği verebilir misiniz?
jmtd

1
@ camh Bildirimi aldığınızdan emin değilim ve bu çok çok eski bir konudur; Eğer yapabilirsen emin değilim, ama cevabını biliyorsanız ben çok merak ediyorum jmtdler soru'? :)
döner

18
  1. Bunun yerine echo hello > -kullanabilirsiniz echo hello > /dev/stdout.

    İken '-' bunu destekleyecek, isteyen her program tarafından uygulanan gereken bir kongre olduğunu /dev/stdin, /dev/stdoutve /dev/stderrvardır, OS (en azından Solaris, Linux ve BSD yapmak) tarafından desteklendiği takdirde daha sonra uygulamanın bağımsız ve senin kadar çalışacak niyet etmek.


9

Camh'ın dediği gibi , -bazı programlar tarafından kullanılan bir adlandırma kurallarıdır. Bu akışlara, kabuğun tanıyacağı bir dosya tanıtıcısıyla başvurmak istiyorsanız, jiliagre, adı /dev/stdinya da adını kullanmanız konusunda haklıydı/dev/stdout . Bu dosya adları normal bir dosya adının çalışacağı herhangi bir yerde çalışmalıdır.

  1. Olduğu söyleniyor, ilk örneğiniz biraz saçma. Yönlendirme operatörü tarafından bir dosyaya yazmak için yakalanacak herhangi bir çıktı zaten standart çıktı'DIR, bu nedenle yeniden yönlendirmek ve nereden geldiğine geri yazmak işe yaramaz. Orada kullandığınız davranış bir yönlendirme değil, yöneltme:

    echo hello |
  2. İkinci örneğinizde, sahip olduğunuz dahili takma adı değil, küçük bir dosya istediğinizi belirten bazı belirtiler vermeniz yeterlidir. Böyle bir dosyaya bir yol belirleyerek bunu en kolay şekilde yapabilirsiniz:

    cat ./-

6

1 gelince, program desteklemelidir. Sadece keyfi olarak kullanamazsınız. 2 gelince, (örneğin, cat < -) girişi yönlendirir .


1

'-' yaklaşımının birçok sorunu var. Öncelikle '-' karakterinin yorumlanmasını gerektirir ve pek çok program bu yorumu yapmaz. Dahası, bir tire'yi komut satırı seçeneklerinin sonunu işaretleyen bir sınırlayıcı olarak yorumlayan bazı programlar vardır. Programlar, dosya ismi argümanları ile çalışmak için yazılmıştır, '-' yaklaşımı bir kesmek, güzel ama zayıftır.

En iyi yol:

$ echo hello > /dev/fd/1

/dev/stdout bir sembolik bağlantıdır /dev/fd/1


Yönlendirme, çağrılan program tarafından değil, kabuk tarafından yorumlanır.
sherrellbc
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.