Answers:
问题在于链接文章中使用的语法。要了解到底出了什么问题,让我们看一下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 documents
并here strings
直接传递字符串。后两者的优点是美观,因为echo
管道示例中的命令是Shell内置命令,因此它将成为wall
在所有情况下提供的输入的Shell 。
wall <<< string
sintax。太好了 你们两个都可以解释<<<
正在做什么吗(为什么像peth所说的那样效率更高)?我觉得需要文件的cmd可以接受之后的字符串,这很奇怪<<<
。再次感谢。
wall
接受它的原因(如果不这样做,则从stdin读取墙) t指定一个文件)。作为验证herestrings是否创建文件的一种方式,$ readlink /proc/self/fd/0 <<< test
将显示/tmp/sh-thd-4228536315 (deleted)
。
尝试用root
root@username:~# wall /home/username/yourfile_name
如果您的文件位于主目录中,请尝试其他路径
echo xxx | yyy
语法的格式,我觉得这很笨拙wall <<<'your message'