Linux wall komutu neden bir dize argümanı yayınlamıyor?


13

Burada bunun işe yarayacağını okudum , ama çalışmıyor:

# usage: wall [file]
root@sys:~> mesg
is y

root@sys:~> wall "who's out there"
wall: can't read who's out there.

Olarak mesgayarlanırsa y, bir dize yayınlamamı engelleyen nedir? Not, dosya seçeneğinin çalıştığını onayladım :

root@sys:~> wall test
Broadcast Message from root@sys (/dev/pts/1) at 15:23 ... 
Who's out there?

Yanıtlar:


21

Sorun, bağlantılı makalede kullanılan sözdiziminde yatmaktadır. Neyin yanlış gittiğini anlamak için bir göz atalım man wall:

Kullanım man wall:

wall [file]

Wall displays the contents of file or, by default, its standard input

Bu yüzden mesajı için iki kaynaktan biriniwall kabul eder .

Dosya adı bağımsız değişkeni

Verilen herhangi bir komut satırı argümanı wallbir dosya adı olmalıdır. Argümanın mesaj mı yoksa dosya adı mı olduğunu anlamanın güvenilir bir yolu olmadığından, wallbunun ikincisi olduğunu varsayar, standart girdiye gelen herhangi bir şeyi yok sayar ve bu dosyadan mesajı okumaya çalışır.

Verilen durumda, dosyadan okumaya çalışır who's out thereve bulamaz. Bir dosyadan okumak genellikle süper kullanıcı ile sınırlıdır. Eğer idam olsaydı wall "who's out there"Normal bir kullanıcı gibi, muhtemelen çıkış, olurduwall: will not read who's out there - use stdin.

Standart giriş

Komut satırında bir dosya adı bağımsız değişkeni alamazsa, standart girdiden okumaya başlar. Bir komutun standart girişine bilgi beslemenin birkaç yolu vardır. Bunlardan biri UNIX borusu kullanmaktır . Bir boru hattı, sol taraftaki komutunun standart çıkışını sağ taraftaki komutun standart girişine bağlar:

$ echo "who's out there" | wall

Başka bir yol da burada bir belge kullanmaktır . A here document, bir dizeyi (kendi satırında belirtilen bir uç işaretçiye kadar) doğrudan bir komutun standart girişine geçiren ve farklı bir komutun o çıktıyı üretmesinin ara adımı olmadan geçen bir kabuk yapısıdır:

$ wall << .
who's out there?
.

Bu, varsayılan olarak terminalin wallstandart girdisine bağlanacağı ve walldosya sonu karakteri ( Ctrl+D) alana kadar ondan okumaya başlayacağı için, "burada belgelerin yararsız kullanımı" olacaktır.

$ wall
who's out there?
^D

As Zengin Homolka açıklamalarda belirtildiği, bazı kabukları destekleyen here stringskomut veya son İşaretçisiz değişmez bir dize geçirerek olanak veren:

$ wall <<< "who's out there?"

Hepsi wallstandart girdiye bir şeyler besler . Ederken fark bir boru hattı buna başka komutun çıktısını bağlayan olmasıdır here documentsve here stringsdoğrudan dize geçmektedir. Buradaki son ikisinin avantajı estetik bir özelliktir, çünkü echoboru örneğindeki komut bir kabuk yerleşik komutudur, bu nedenle her durumda kabuk sağlayan wallgiriş olacaktır.


1
Bash / echo xxx | yyyzsh'ın sözdiziminden kaçınmak için başka bir biçimi var , bu da cludgy'yi buldumwall <<<'your message'
Rich Homolka

Bir Zengin olduğundan emin değilim - bir .bashrc veya zsh eşdeğeri ne olursa olsun, duvarın sözdizimi kabuğa dayanmamalıdır. Ben de bash kullanıyorum.
mbb

Teşekkürler peth - öğrenmem gereken sözdizimsel organizasyon!
mbb

Benim hatam Zengin! Peth'in açıklaması ile şimdi wall <<< stringsintaks sunduğunuzu görüyorum . Harika. Her ikiniz de <<<tam olarak ne yaptığını (peth'in söylediği gibi neden daha verimli olacağını) açıklayabilir misiniz ? Ben bir dosya gerektiren bir cmd sonra bir dize kabul garip buluyorum <<<. Tekrar teşekkürler.
mbb

1
mjb Aslında bu testin yankıdan daha etkili olması pek olası değildir - herestrings geçici bir dosya oluşturarak çalışır ve daha sonra bunu bir sürecin stdin'i (dosya tanımlayıcı 0) olarak ekler, bu yüzden wallkabul eder (eğer yapmazsanız duvar stdin'den okunur) t bir dosya belirtin). Herestring'lerin bir dosya oluşturduğunu doğrulamanın bir yolu olarak, benzer bir $ readlink /proc/self/fd/0 <<< testşey yazdıracaktır /tmp/sh-thd-4228536315 (deleted).
Stuart P. Bentley

0

root ile dene

root@username:~# wall /home/username/yourfile_name 

dosyanız giriş dizinindeyse başka bir yol deneyin

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.