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, wall
chấ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 wall
phả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, wall
sẽ 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 there
và 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 document
là 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à wall
sẽ 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 strings
cho 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 documents
và here strings
truyền trực tiếp chuỗi. Ưu điểm của hai cái sau ở đây là tính thẩm mỹ, vì echo
lệ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.
echo xxx | yyy
cú pháp mà tôi thấy khó hiểuwall <<<'your message'