我正在寻找一种简单的方法来在文档中包含内联的多行脚本,以使其每个步骤的作用透明。
这有效
echo "echo 1234" | bash
这也是
echo 'for N in 1 2 3; do echo $N; done' | bash
但是,我想使用这样的东西(这不起作用):
echo <<EOF | bash
for N in 1 2 3; do
echo "N is ${N}"
done
EOF
更新,到目前为止最接近的工作解决方案是:
cat <<EOF|bash
for N in 1 2 3 4; do
echo "N is now \$N"
done
EOF
理想情况下,虽然我不想逃避\$N
正确的解决方案不会:
- 使用未安装的工具 默认 debian 配置
- 涉及临时文件
- 下载脚本(
curl -o - htpp://blah.com/script | bash
等)
理想情况下,读者可以复制粘贴,按回车,无需进一步操作即可执行。
我认为你能做的最好的事情是这样的:
请注意,这实际上将 while 脚本作为参数提供给
-c
开关,并且此参数本身将由bash
. 这就是为什么你不能使用"
这样的标志:因为在参数中,
$THING
在作为参数传递之前被替换,并且由于THING
未设置,它将被替换为空字符串。不解析包含在撇号中的字符串,因此它可用于包含要在“第二个 bash 进程”解析脚本时设置的变量。对于更复杂的脚本,我认为最好的方法是让你的读者保存脚本并运行它,但对于简单的结构,上面应该可以工作。
如果您引用或转义 here-document 定界符(即
<<'EOF'
或<<\EOF
不只是<<EOF
),shell 将不会对内容进行(变量等的)扩展。顺便说一句,该
cat
命令在这里并没有真正做任何有用的事情(这就是所谓的“无用的 cat”,或 UUoC)。您可以消除它并将输入直接发送到bash
:如果片段需要读取输入,这有点棘手,因为脚本的输入是……脚本片段本身。在大多数类似 unix 的操作系统上,您可以通过将脚本传递给不同的文件描述符并告诉
bash
“执行”该文件描述符来避免这种情况:但请注意,在这些片段之一中设置的任何变量(如此
$input
处)仅在该一个 shell 进程中设置,并且在退出时将丢失。