bash脚本执行echo写入PHP文件时if条件判断行缺失原因咨询
行丢失的根本原因
丢失行的核心诱因是 Bash的历史扩展(History Expansion)特性 被触发:
- 如果你是直接将这段代码复制到交互式Bash终端执行,双引号默认不会抑制
!字符触发的历史扩展逻辑。你代码中if (!defined('MACHINE_ID')) {行的!后紧跟defined字符串,Bash会尝试检索历史命令中以defined开头的命令。 - 当未匹配到对应历史命令时,Bash要么会抛出"event not found"错误,要么在部分默认配置下会直接裁剪掉触发扩展的整行内容,最终导致输出到文件的内容缺少了包含if判断的行。
补充说明:如果你是将脚本保存为
.sh文件通过bash xxx.sh执行,非交互式Bash默认关闭历史扩展,不会出现该问题,所以问题多发生在直接复制命令到终端执行的场景。
修复方案
- 方案1:将echo包裹的内容改用单引号包裹,单引号会原样输出所有内部字符,注意内部的单引号需要用
'\''转义:
#!/bin/bash echo '<?php if (!defined('\''MACHINE_ID'\'')) { define('\''MACHINE_ID'\'','\''SERVER_ID'\''); } ' > /var/www/html/NODE20_CONFIG.php
- 方案2:执行命令前先在当前终端运行
set +H关闭历史扩展,执行完命令后可执行set -H恢复默认配置。 - 方案3:将脚本内容保存为文件后再执行,避免交互式环境的特殊字符解析问题。
内容的提问来源于stack exchange,提问作者Paweł
相关产品推荐
相关产品推荐

