Neden işlem değişikliği / pip / dev / fd / 63 adlı bir dosyayla sonuçlanır?


40

Bu belirli örnek bağlamında adlandırılmış yöneltmeler anlamaya çalışıyorum.

Yazarken <(ls -l), benim terminalde gibi çıktı almak bash: /dev/fd/63: Permission denied.

Eğer cat <(ls -l)yazarsam, dizin içeriğini görebilirdim. Ben değiştirirseniz catile echo, ben terminali adını almak düşünüyorum (ya öyle?).

echo <(ls -l)çıktıyı olarak verir /dev/fd/63.

Ayrıca, bu örnek çıktı bana açık değil.

ls -l <(echo "Whatever")
lr-x------ 1 root root 64 Sep 17 13:18 /dev/fd/63 -> pipe:[48078752]

Ancak, eğer verirseniz, ls -l <()bana dizin içeriğini listeler.

Adlandırılmış boru durumunda ne oluyor?

Yanıtlar:


37

Bunu yaptığınızda <(some_command), kabuğunuz parantez içindeki komutu çalıştırır ve her şeyi komutun stdout'una bağlı bir dosya tanıtıcısı ile değiştirir. Öyleyse /dev/fd/63, çağrının çıkışını içeren bir boru var.

Bir hata <(ls -l)alırsanız Permission denied, çünkü tüm satır boru ile değiştirilir, etkin /dev/fd/63olarak çalıştırılamayan bir komut olarak çağırmaya çalışırsınız .

İkinci örneğinde, cat <(ls -l)olur cat /dev/fd/63. Cat, parametre olarak verilen dosyalardan okuduğunda, içeriği alırsınız. echoÖte yandan sadece "olduğu gibi" parametrelerini çıkarır.

Sahip olduğunuz son dava <(), hiçbir komut olmadığı için basitçe hiçbir şey ile değiştirilmez. Ancak bu kabukları arasında tutarlı değil, zsh'de hala bir boru alıyorsunuz (boş olmasına rağmen).

Özet : <(command)normalde bir dosyaya ihtiyaç duyacağınız bir komutun çıkışını kullanmanıza izin verir.

Düzenleme: Gilles'un işaret ettiği gibi , bu adlandırılmış bir boru değil, isimsiz bir borudur. Asıl fark, yalnızca süreç devam ettiği sürece var olmasıdır; buna karşılık adlandırılmış bir boru (örn. İle oluşturulan mkfifo) buna bağlı olmayan süreçler kalacaktır.


5
mkfifoyalnızca adlandırılmış yöneltmeyi, hiçbir içerik olmadan oluşturur. Bu yüzden kendinize yazmanız gerekir (örneğin mkfifo mypipe; ls > mypipe). Ve evet, boruya yazılanlar bir işlem borudan okunana kadar engellenir.
krater2150 17:14

6
Burada adlandırılmış yöneltme yok. /dev/fd/63anonim bir boru.
Gilles 'SO- kötülük' dur

1
@ krater2150, @Gilles / dev / fd / 63 gerçekten adlandırılmış bir borudur. Şunun gibi bir şeyi kontrol et file <(ls). Kabuk, adsız bir boru oluşturur, ancak dosya tanımlayıcısı içinde adlandırılmış bir boru olarak yansıtır /dev/fd. Eğer isimsiz bir boru olsaydı, bir isme sahip olmaz ve /dev/fd/63kendisine iletilen bir komutla açılamazdı .
rv

2
@rv Hala isimsiz bir boru. Bu adsız boruyu ifade eden bir dosya adının bulunması, onu adlandırılmış bir boru yapmaz: adlandırılmış bir boru farklıdır, bir dosya sisteminde bir yerde bulunur, izin ve sahiplik vb. Vardır. Girişleri /dev/fdherhangi bir dosyaya başvurabilir. açıklayıcısı, hatta anonim boru ve prizler, ağ yuvaları paylaşılan bellek kesimleri, vb
Gilles 'SO dur olma kötülük'

1
Neden 63 yaşında?
K3 --- rnc

-4

Hem lskomutu hem de yönlendirmeyi yanlış anladınız. lskomut satırında verilen dosya ve dizinleri listeler, stdin'den herhangi bir girdi kabul ettiğini sanmıyorum. Yeniden yönlendirme > >>ve <girdi vermek ve çıktı toplamak için bir dosyayı kullanmanın yollarıdır.


1
Burada bir dosyadan yönlendirme yok. <(…)bir işlem ikamesidir.
Gilles 'SO- kötülük' dur

1
@IMSoP - Gilles'un dediği gibi - adlandırılmış bir boru değil - anonim bir boru. Çok fazla aynıdır x|yve neredeyse özdeş [num]<<REDIRECTbazı kabuklarda. Farklılaştığı durumda, kabuğun fd linkinin - /dev/fd/63ve etc. Yap echo | readlink /dev/fd/0ve kendin gör.
mikeserv

1
@IMSoP - bu bir devlink - özel bir dosya. Aynı w / herhangi bir dosya tanımlayıcısını çoğu linux sistemde de yapabilirsiniz - tipik |pipesolsa bile , başka bir yerdeki davranışa kefil olmam. Nereden geldiğini anlıyorum, ancak adlandırılmış bir boru kendi başına ayrı bir şey - bir çekirdek dosyaya bir dosya sistemi başvurusu - normal bir dosya sistemi başvurusu, bir aygıt dosyası değil.
mikeserv

1
@mikeserv İlginç bir şekilde, Bash el kitabı/dev/fd/* başka bir yerde adlandırılmış bir boru oluşturmadan sistemler üzerinde çalışacağını söyler . Ancak, /dev/fd/*kendisinin uygun bir adlandırılmış borudan farklı bir mekanizma olduğu fikrine kapılıyorum. Bu arada, Wikipedia'nın açıklaması bu ayrımın bir açıklamasıyla yapabilirdi.
IMSoP

1
@mikeserv Bulduğum diğer referanslara göre, bundan daha basittir: eğer /dev/fd/*mevcut değilse, bash isimlendirilmiş bir boru yapacaktır /tmpve bunun yerine işlem yerine kullanılacaktır. Bana o kadar garip gelmiyor, sadece işlevselliği mümkün olduğu kadar çok ortamda kullanabiliyordum.
IMSoP
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.