在 php 中通过 shell_exec 执行多行 shell 命令时,需确保每行末尾(除最后一行外)均以反斜杠 `\` 正确续行,且 heredoc 语法中不得存在缩进或多余空格干扰命令解析。
在 PHP 中使用 shell_exec() 执行多行 Shell 命令是常见需求(例如调用 ImageMagick 的 convert 进行图像处理),但容易因换行与转义问题导致命令失败。关键在于:Shell 层面的续行必须由反斜杠 \ 显式声明,且该反斜杠必须紧贴行尾(后不可跟空格、制表符或任何字符);同时,PHP 的 HEREDOC(如
✅ 正确写法示例(修复原问题):
$cmd = <<e/test.jpg \\ -font Nimbus-Sans-L -pointsize 20 \\ -draw "gravity south fill black text 0,12 'Copyright' fill white text 1,11 'Copyright'" \\ test2.jpg CMD; $output = shell_exec($cmd); if ($output === null || $output === false) { error_log("Command failed or returned empty output."); }
⚠️ 注意事项:
- 每行末尾的 \ 必须是该行最后一个非空白字符:若其后有空格或 Tab,Shell 将忽略续行,导致语法错误;
- HEREDOC 中不能缩进命令行:
- 转义反斜杠本身:在 HEREDOC 中,单个 \ 在 Shell 中是续行符,但在 PHP 字符串中需写为 \\(即两个反斜杠),因为 PHP 会先解析一次转义——这是最容易被忽略的关键点!上例中 \\ 经 PHP 解析后变为 \,再交由 Shell 执行;
- 调试建议:先用 echo $cmd; 输出实际拼接的命令字符串,复制到终端手动执行验证逻辑;
- 安全警示:避免拼接用户输入到 $cmd 中,防止 Shell 注入;必要时应使用 escapeshellarg() 对路径和参数单独转义。
? 小结:多行命令 ≠ 自动换行。本质是「PHP 构造含续行符的字符串 → 交由 Shell 解释执行」。只要保证 \ 位置精准、无多余空白、正确双写为 \\,即可稳定运行复杂命令。

e/test.jpg \\
-font Nimbus-Sans-L -pointsize 20 \\
-draw "gravity south fill black text 0,12 'Copyright' fill white text 1,11 'Copyright'" \\
test2.jpg
CMD;
$output = shell_exec($cmd);
if ($output === null || $output === false) {
error_log("Command failed or returned empty output.");
}






