为什么 Linux wall 命令不广播字符串参数?

为什么 Linux wall 命令不广播字符串参数?

我读这里这应该可行,但事实并非如此:

# 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 documentshere strings直接传递字符串。后两者的优势在于美观,因为echo管道示例中的命令是 shell 内置命令,因此在所有情况下都是 shell 提供wall的输入。

答案2

尝试使用 root

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

如果您的文件位于主目录中,否则尝试其他路径

相关内容