一行中能否使用两个here-document?技术实操问题咨询
关于一行中使用两个Here-Document的问题
其实在一行里定义多个here-document是语法允许的,但你没达到预期效果,大概率是没遵守here-doc的核心规则——每个here-doc的结束标记必须单独占一行,不能和其他命令、内容挤在同一行,否则shell会解析混乱。
举个简单的反例,如果你写成这样:
echo <<EOF hello <<EOF2 world EOF EOF2
shell会把第一个EOF当成echo的参数,然后把echo <<EOF2 world EOF2当成另一个独立命令,结果就是两个echo各自输出空行(因为here-doc的内容不合法,被shell忽略了),这就是你看到两个echo输出的原因。
正确的写法(包括你要测试的ssh+sudo场景)
如果是要在ssh里嵌套sudo执行命令,正确的嵌套here-doc写法应该是这样的:
ssh your-host <<'REMOTE_EOF' sudo -u target-user <<'SUDO_EOF' echo "当前用户:$(whoami)" echo "当前目录:$(pwd)" # 这里可以放你要测试的命令 SUDO_EOF REMOTE_EOF
这里有两个关键细节:
- 用单引号包裹外层的
REMOTE_EOF,防止本地shell解析里面的变量(比如$(whoami)),让远程shell去处理这些内容。 - 每个结束标记
REMOTE_EOF和SUDO_EOF都单独占一行,前后不能有任何空格(如果允许前导制表符,可以用<<-DELIMITER)。
如果非要把启动部分放在同一行,也得保证结束标记单独成行,比如:
echo <<EOF1 && echo <<EOF2 第一个here-doc的内容 EOF1 第二个here-doc的内容 EOF2
这样两个echo会分别读取各自here-doc的内容并输出。
总的来说,here-doc的核心规则不能破:结束标记必须单独一行,否则shell根本没法正确识别输入的边界,自然达不到你想要的效果。
内容的提问来源于stack exchange,提问作者dabest1




