Tại sao lệnh Linux wall không phát ra một đối số chuỗi?


13

Tôi đọc ở đây rằng nó sẽ hoạt động, nhưng nó không:

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

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

Nếu mesgđược đặt thành y, điều gì ngăn tôi phát một chuỗi? Lưu ý, tôi đã xác nhận rằng tùy chọn tập tin hoạt động:

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

Câu trả lời:


21

Vấn đề nằm ở cú pháp được sử dụng trong bài viết được liên kết. Để hiểu chính xác những gì sai, chúng ta hãy xem man wall:

Cách sử dụng từ man wall:

wall [file]

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

Vì vậy, wallchấp nhận một trong hai nguồn cho thông điệp của nó.

Đối số tên tệp

Bất kỳ đối số dòng lệnh được đưa ra wallphải là một tên tệp. Vì không có cách nào đáng tin cậy để biết liệu đối số có nghĩa là thông điệp hoặc tên tệp hay không, wallsẽ cho rằng đó là thông tin sau, bỏ qua mọi thứ xuất hiện trong đầu vào tiêu chuẩn và cố gắng đọc tin nhắn từ tệp đó.

Trong trường hợp cụ thể, nó cố gắng đọc từ tệp who's out therevà không tìm thấy nó. Lưu ý rằng việc đọc từ một tệp thường được giới hạn trong siêu người dùng. Nếu bạn thực hiệnwall "who's out there" như một người dùng không có đặc quyền, có thể đầu ra của nó sẽ là,wall: will not read who's out there - use stdin.

Đầu vào tiêu chuẩn

Nếu nó không nhận được một đối số tên tệp trên dòng lệnh của nó, nó sẽ bắt đầu đọc từ đầu vào tiêu chuẩn. Có một số cách để cung cấp thông tin cho đầu vào tiêu chuẩn của lệnh. Một là sử dụng một ống UNIX . Một đường ống sẽ kết nối đầu ra tiêu chuẩn của lệnh bên trái của nó với đầu vào tiêu chuẩn của lệnh bên phải của nó:

$ echo "who's out there" | wall

Một cách khác là sử dụng một tài liệu ở đây . A here documentlà một cấu trúc shell truyền trực tiếp một chuỗi (tối đa một điểm đánh dấu kết thúc được chỉ định trên một dòng của chính nó) đến đầu vào tiêu chuẩn của lệnh, mà không có bước trung gian để có một lệnh riêng biệt tạo ra đầu ra đó:

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

Đây sẽ là "việc sử dụng vô ích các tài liệu ở đây", vì theo mặc định, thiết bị đầu cuối sẽ được kết nối với wallđầu vào tiêu chuẩn và wallsẽ bắt đầu đọc từ đó cho đến khi nhận được ký tự cuối tệp ( Ctrl+D):

$ wall
who's out there?
^D

Như Rich Homolka đã lưu ý trong các bình luận, một số shell hỗ trợ here stringscho phép chuyển một chuỗi ký tự mà không cần lệnh hoặc dấu kết thúc:

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

Tất cả cung cấp một cái gì đó để wallđầu vào tiêu chuẩn. Sự khác biệt là một đường ống kết nối đầu ra của một lệnh khác với nó, trong khi here documentshere stringstruyền trực tiếp chuỗi. Ưu điểm của hai cái sau ở đây là tính thẩm mỹ, vì echolệnh từ ví dụ ống là lệnh tích hợp shell, vì vậy nó sẽ là vỏ cung cấp wallđầu vào trong mọi trường hợp.


1
Bash / zsh có một định dạng khác để tránh echo xxx | yyycú pháp mà tôi thấy khó hiểuwall <<<'your message'
Rich Homolka

Tôi không chắc chắn về một Người giàu đó - cú pháp của tường không nên dựa trên lớp vỏ trừ khi có .bashrc hoặc bất cứ thứ gì tương đương với zsh. Tôi cũng dùng bash.
mbb

Cảm ơn bạn - đó là tổ chức cú pháp tôi cần học!
mbb

Sai lầm của tôi Giàu! Với sự làm rõ của Peth bây giờ tôi thấy rằng bạn đang cung cấp wall <<< stringsintax. Điều đó thật tuyệt vời. Một trong hai bạn có thể giải thích <<<chính xác những gì đang làm (và tại sao nó sẽ hiệu quả hơn như peth đã nói)? Tôi thấy thật kỳ lạ khi một cmd yêu cầu một tệp có thể chấp nhận một chuỗi sau đó <<<. Cảm ơn một lần nữa.
mbb

1
@mjb Thực sự không chắc rằng herestring hiệu quả hơn echo - herestrings hoạt động bằng cách tạo một tệp tạm thời, sau đó đính kèm nó như một stdin của quá trình (mô tả tệp 0), đó là lý do tại sao wallchấp nhận nó (tường đọc từ stdin nếu bạn không ' t chỉ định một tập tin). Như một cách để xác minh rằng các herestrings tạo một tập tin, $ readlink /proc/self/fd/0 <<< testsẽ in một cái gì đó như thế nào /tmp/sh-thd-4228536315 (deleted).
Stuart P. Bentley

0

thử với root

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

nếu tập tin của bạn nằm trong thư mục nhà, nếu không hãy thử một đường dẫn khác

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.