为什么这个“while read”在终端中工作,而不是在shell脚本中?

inv*_*ert 7 bash shell-script

我在用信息文本填充我的 WM 栏时遇到了这个有趣的问题,这是通过设置根窗口的标题来应用的,即 xsetroot -name "clever words"

为此,在终端中打印财富可以正常工作:

fortune -s | while read -r; do xsetroot -name "$REPLY"; done
Run Code Online (Sandbox Code Playgroud)

然而,当从 shell 脚本运行时,同样会失败:

#!/bin/sh
cat /tmp/afile | while read; do echo "$REPLY"; done
Run Code Online (Sandbox Code Playgroud)

产生:

$ sh afilereader
afilereader: 2: read: arg count

当然,这是通过将我们的财富结果分配给一个变量,然后将 xsetroot 与所述变量一起使用来解决的。但我仍然想了解为什么这在脚本中不起作用。

我意识到管道任一侧的每个命令都在它自己的子 shell 中运行,但看不到它们的本地化变量如何影响 while 读取循环。或者甚至在循环迭代之间变量是否超出范围?

我错过了什么?

更新:sh我以前被链接到仪表板,这是正在取得POSIX兼容的过程。使用更古老的bash解决了这个问题。

Chr*_*own 10

您似乎正在 中运行第一个示例bash,而在 指向的任何内容中运行第二个示例/bin/sh,这是一个 POSIX shell,需要传递一个参数来指定您希望将输入放入的变量。将shebang更改为#!/bin/bash应该可以解决此问题。