Mengapa perintah dinding Linux tidak menyiarkan argumen string?

13

Saya membaca di sini bahwa ini seharusnya berhasil, tetapi tidak:

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

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

Jika mesgdiatur ke y, apa yang mencegah saya menyiarkan string? Catatan, saya memang mengkonfirmasi bahwa opsi file berfungsi:

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

Jawaban:

21

Masalahnya terletak pada sintaks yang digunakan dalam artikel yang ditautkan. Untuk memahami apa yang sebenarnya salah, mari kita lihat man wall:

Penggunaan dari man wall:

wall [file]

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

Jadi wallterima salah satu dari dua sumber untuk pesannya.

Argumen nama file

Argumen baris perintah apa pun yang diberikan wallharus berupa nama file. Karena tidak ada cara yang dapat diandalkan untuk mengetahui apakah argumen tersebut dimaksudkan sebagai pesan atau nama file, wallakan menganggapnya sebagai yang terakhir, mengabaikan apa pun yang masuk pada input standar , dan mencoba membaca pesan dari file itu.

Dalam kasus yang diberikan, ia mencoba membaca dari file who's out theredan tidak menemukannya. Perhatikan bahwa membaca dari file biasanya terbatas pada superuser. Jika Anda dieksekusi wall "who's out there"sebagai pengguna yang tidak memiliki hak, kemungkinan hasilnya adalah,wall: will not read who's out there - use stdin.

Input standar

Jika tidak mendapatkan argumen nama file pada baris perintahnya, ia akan mulai membaca dari input standar. Ada beberapa cara untuk memasukkan informasi ke input standar dari suatu perintah. Salah satunya adalah menggunakan pipa UNIX . Sebuah pipa akan menghubungkan output standar dari perintah sisi kiri dengan input standar dari perintah sisi kanannya:

$ echo "who's out there" | wall

Cara lain adalah dengan menggunakan dokumen di sini . A here documentadalah konstruksi shell yang meneruskan string (hingga penanda akhir yang ditentukan pada barisnya sendiri) secara langsung ke input standar dari suatu perintah, tanpa langkah menengah untuk memiliki perintah yang berbeda menghasilkan output:

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

Ini akan menjadi "penggunaan dokumen-dokumen yang tidak berguna di sini", karena secara default terminal itu sendiri akan terhubung ke wallinput standar dan wallakan mulai membaca darinya sampai menerima karakter akhir file ( Ctrl+D):

$ wall
who's out there?
^D

Seperti yang dikatakan Homolka Kaya dalam komentar, beberapa cangkang mendukung here stringsyang memungkinkan melewati string literal tanpa komando atau penanda akhir:

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

Semua memberi makan sesuatu untuk wallinput standar. Perbedaannya adalah bahwa pipa menghubungkan output dari perintah lain ke sana, sementara here documentsdan here stringsmeneruskan string secara langsung. Keuntungan dua yang terakhir di sini adalah yang estetis, karena echoperintah dari contoh pipa adalah perintah bawaan shell, sehingga shell akan memberikan wallinput dalam semua kasus.

peth
sumber
1
Bash / zsh memiliki format lain untuk menghindari echo xxx | yyysintaks, yang saya temukan tidak jelaswall <<<'your message'
Rich Homolka
Saya tidak yakin tentang yang Kaya - sintaks dinding tidak boleh didasarkan pada shell kecuali ada .bashrc atau apa pun yang setara dengan zsh. Saya menggunakan bash juga.
mbb
Terima kasih ya - itulah organisasi sintaksis yang perlu saya pelajari!
mbb
Kesalahan saya Rich! Dengan klarifikasi Peth, sekarang saya tahu Anda menawarkan wall <<< stringsintaks. Cukup bagus. Bisakah kalian menjelaskan apa <<<yang sebenarnya dilakukan (dan mengapa itu akan lebih efisien seperti kata peth)? Saya merasa aneh bahwa cmd yang memerlukan file dapat menerima string setelah <<<. Terima kasih lagi.
mbb
1
@ mjb Sebenarnya tidak mungkin bahwa herestring lebih efisien daripada gema - herestrings bekerja dengan membuat file sementara, dan kemudian melampirkannya sebagai stdin proses (deskriptor file 0), itulah sebabnya wallmenerimanya (dinding membaca dari stdin jika Anda tidak mau ' t tentukan file). Sebagai cara memverifikasi bahwa herestrings membuat file, $ readlink /proc/self/fd/0 <<< testakan mencetak sesuatu seperti /tmp/sh-thd-4228536315 (deleted).
Stuart P. Bentley
0

coba dengan root

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

jika file Anda ada di direktori home atau coba jalur lain

mohamadali abasnejad
sumber