Dan*_*scu 6 shell bash shell-script read
我想下载一个通过 读取一些配置参数的配置脚本read,然后执行它:
curl http://example.com/provisioning.sh | sh
Run Code Online (Sandbox Code Playgroud)
问题是,read脚本中的命令是使用-i参数调用以提供默认值:
read -p "Name: " -i joe name
echo $name
Run Code Online (Sandbox Code Playgroud)
如果我下载脚本,设置+x权限并运行它,一切都很好。
如果我用cat provisioning.sh | sh或运行它sh provisioning.sh,它会失败:
read: Illegal option -i
Run Code Online (Sandbox Code Playgroud)
如果通过 sh 运行,为什么不读取支持提供默认值?
但无论如何,我会删除-i, 剩下的
read -p "Name: " name
echo $name
Run Code Online (Sandbox Code Playgroud)
现在,如果我通过 运行脚本cat provisioning.sh | sh,它不会做任何事情。这是为什么?
Ubuntu 14.04。
当通过管道输出curl到sh你正在做的脚本文本是外壳,这需要它作为命令来运行的标准输入。在那之后,就什么都没有了read。即使它要尝试,它也不会从终端输入中得到任何东西,因为它没有连接到它。管道已取代sh流程的标准输入。
接下来的问题是,read -i是不是一个POSIX sh的功能,而是一个扩展的支持bash。默认情况下,Ubuntu 使用dash具有最少扩展名的最小 POSIX 兼容 shell /bin/sh。这就是它-i明确拒绝该选项的原因(尽管它确实支持-p)。
如果您自己使用功能更强大的 shell,则可以尝试以下操作:
bash <(curl http://example.com/provisioning.sh)
Run Code Online (Sandbox Code Playgroud)
它创建了一个管道,bash用于读取curlfrom的输出并将其作为脚本文件参数提供。在这种情况下,脚本的标准输入仍然连接到终端,并且read可以工作(但请注意该行下方的大警告)。
我还要指出,“ curl | sh”是一般 皱着眉头 在作为一个明显的安全问题,但你知道得最清楚你的脚本的情况。