
在 php 中通过 shell_exec 执行多行 shell 命令时,需确保每行末尾(除最后一行)均以反斜杠 `\` 显式续行,且此处的 `\` 必须紧贴行末(后无空格),否则会被视为字面量而非续行符。
PHP 的 shell_exec() 函数仅接受单个字符串参数作为完整命令,因此多行命令必须逻辑上“拼接为一行”。Heredoc(如 <<<CMD)本身不会自动合并换行或处理续行——它只是原样保留内容。真正的续行行为由 Shell 解析器(如 bash)完成,而 Shell 要求:反斜杠 \ 必须是行末最后一个非空白字符,否则续行失效。
✅ 正确写法(关键:每行末尾 \ 后无空格、无制表符):
$cmd = <<<CMD
convert /home/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 视为普通字符,报错如 command not found);
- 首行或中间行遗漏 \(Shell 将换行当作命令分隔,提前终止);
- Heredoc 结束标识符 CMD; 前有空格(违反 PHP 语法,会报 Parse error)。
? 提示与最佳实践:
立即学习“PHP免费学习笔记(深入)”;
- 使用 escapeshellarg() 对动态路径/参数进行转义,防止命令注入;
- 优先考虑 exec() 或 proc_open() 替代 shell_exec(),便于捕获错误输出(如 2>&1);
- 在生产环境避免直接拼接用户输入;若必须,务必严格校验和过滤(如白名单文件扩展名、路径前缀限制);
- 测试时可用 echo $cmd | bash 在终端验证命令语法是否有效。
总结:多行命令不是靠 PHP 拼接,而是靠 Shell 续行机制;shell_exec() 的职责只是把字符串交给 Shell 执行——因此,写出符合 Shell 语法的、带正确 \ 续行符的字符串,才是根本解法。











