You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

一行中能否使用两个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_EOFSUDO_EOF都单独占一行,前后不能有任何空格(如果允许前导制表符,可以用<<-DELIMITER)。

如果非要把启动部分放在同一行,也得保证结束标记单独成行,比如:

echo <<EOF1 && echo <<EOF2
第一个here-doc的内容
EOF1
第二个here-doc的内容
EOF2

这样两个echo会分别读取各自here-doc的内容并输出。

总的来说,here-doc的核心规则不能破:结束标记必须单独一行,否则shell根本没法正确识别输入的边界,自然达不到你想要的效果。

内容的提问来源于stack exchange,提问作者dabest1

火山引擎 最新活动