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


13

在这里读到这应该起作用,但是不起作用:

# 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,是什么阻止了我播放字符串?注意,我确实确认file选项有效:

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

Answers:


21

问题在于链接文章中使用的语法。要了解到底出了什么问题,让我们看一下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

另一种方法是使用here文档。A here document是一个shell构造,将字符串(直到其自身的一行上的指定结束标记)直接传递到命令的标准输入,而没有使不同的命令产生该输出的中间步骤:

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

这将是“此处文档的无用使用”,因为默认情况下,终端本身将连接到wall的标准输入,wall并将开始从其读取直到接收到文件结束符(Ctrl+D):

$ wall
who's out there?
^D

正如Rich Homolka在评论中指出的那样,一些shell支持here strings允许传递不带命令或结束标记的文字字符串:

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

所有的东西都wall输入到的标准输入中。区别在于,管道将另一个命令的输出连接到它,而here documentshere strings直接传递字符串。后两者的优点是美观,因为echo管道示例中的命令是Shell内置命令,因此它将成为wall在所有情况下提供的输入的Shell 。


1
Bash / zsh还有另一种避免echo xxx | yyy语法的格式,我觉得这很笨拙wall <<<'your message'
Rich Homolka

我不确定一个Rich-wall的语法不应基于shell,除非存在.bashrc或等效的zsh。我也用bash。
mbb 2011年

谢谢peth-这是我需要学习的语法组织!
mbb 2011年

我的错误Rich!通过Peth的澄清,我现在看到您正在提供wall <<< stringsintax。太好了 你们两个都可以解释<<<正在做什么吗(为什么像peth所说的那样效率更高)?我觉得需要文件的cmd可以接受之后的字符串,这很奇怪<<<。再次感谢。
mbb 2011年

1
@mjb Herestring实际上不太可能比echo更有效-HereString通过创建一个临时文件,然后将其附加为进程的stdin(文件描述符0)来工作,这就是为什么wall接受它的原因(如果不这样做,则从stdin读取墙) t指定一个文件)。作为验证herestrings是否创建文件的一种方式,$ readlink /proc/self/fd/0 <<< test将显示/tmp/sh-thd-4228536315 (deleted)
Stuart P. Bentley

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.