Bash 可以从管道运行脚本。一个最小的例子是:
> echo "echo hello world" | bash
hello world
如果您想运行从curl
或下载的脚本,这很方便wget
。
但显然,您不能read
在这种脚本执行中使用。例如,
#!/bin/bash
echo 'input: '
read HELLO
echo hello: $HELLO
如果您只是从 bash 脚本文件运行上述脚本,您将可以输入$HELLO
. 并将echo hello: $HELLO
打印结果。
如果您以我们之前讨论的方式提供脚本:
> echo "echo 'input: '; read HELLO; echo hello: $HELLO" | bash
input:
hello:
你根本不会得到互动。并且$HELLO
仍然是空的。我也尝试-i
在 bash 中添加选项,但没有成功。
有什么方法可以read
在流水线脚本中使用吗?如何?或者,如果我们不能,为什么?
read
将通过标准输入(它将从中读取内容)和标准错误(它将打印其-p
提示,如果有的话)与用户“交互”。如果 stdin 是script,
read
将从中获取它的内容,导致它跳过一行:这不是一个好的做法,并且不适用于所有 shell。另请注意,当通过标准输入管道脚本时,
bash
必须逐字节读取它们。在您的示例中,您的整个脚本是一行,因此
read
内置函数只会获取 EOF 而不会设置任何变量。如果您想
read
始终从控制 tty 读取,则显式重定向它:这也应该谨慎使用。如果他们必须使用
expect(1)
来检测您的脚本,没有人会感激您。