我读这里这应该可行,但事实并非如此:
# usage: wall [file]
root@sys:~> mesg
is y
root@sys:~> wall "who's out there"
wall: can't read who's out there.
如果mesg
设置为y
,是什么阻止我广播字符串?请注意,我确实确认了文件选项工作:
root@sys:~> wall test
Broadcast Message from root@sys (/dev/pts/1) at 15:23 ...
Who's out there?
答案1
问题在于链接文章中使用的语法。要了解到底出了什么问题,让我们看一下man wall
:
使用自man wall
:
wall [file]
Wall displays the contents of file or, by default, its standard input
所以wall
接受任何一个其信息的两个来源。
文件名参数
给出的任何命令行参数都wall
必须是文件名。由于没有可靠的方法来判断参数是消息还是文件名,因此wall
将假设它是后者,忽略传入的任何内容标准输入,并尝试从该文件读取消息。
在给定的情况下,它尝试读取文件who's out there
但找不到它。请注意,读取文件通常仅限于超级用户。如果您wall "who's out there"
以非特权用户身份执行,则其输出可能是,wall: will not read who's out there - use stdin.
标准输入
如果命令行中没有文件名参数,它将开始从标准输入读取。有几种方法可以将信息提供给命令的标准输入。一种方法是使用UNIX 管道管道会将其左侧命令的标准输出连接到其右侧命令的标准输入:
$ echo "who's out there" | wall
另一种方法是使用这里的文件. Ahere document
是一个 shell 构造,它将字符串(直到其自身所在行上的指定结束标记)直接传递到命令的标准输入,而无需通过不同的命令生成该输出的中间步骤:
$ wall << .
who's out there?
.
这将是“此处文档的无用使用”,因为默认情况下终端本身将连接到的wall
标准输入并wall
开始从中读取,直到收到文件结束字符(Ctrl+D):
$ wall
who's out there?
^D
作为里奇·霍莫尔卡在评论中指出,一些 shell 支持here strings
允许传递没有命令或结束标记的文字字符串:
$ wall <<< "who's out there?"
所有命令都会将某些内容提供给wall
的标准输入。不同之处在于管道将另一个命令的输出连接到它,而here documents
和here strings
直接传递字符串。后两者的优势在于美观,因为echo
管道示例中的命令是 shell 内置命令,因此在所有情况下都是 shell 提供wall
的输入。
答案2
尝试使用 root
root@username:~# wall /home/username/yourfile_name
如果您的文件位于主目录中,否则尝试其他路径