如何移除Perforce表单触发器生成的描述首字符$
解决Perforce触发器脚本中变更描述首字符多余$的问题
在Linux环境的Perforce服务器上配置form-out触发器,通过存储在depot中的bash脚本自动替换变更列表的默认描述。单行描述正常,但多行描述采用ANSI-C转义语法($'...')后,生成的描述开头会多出一个$符号,示例输出:
$Jira Ticket: High level summary - Detailed change #1 - Detailed change #2
触发器配置如下:
Triggers: desc-out form-out change "sh %//tools/main/Perforce/defaultChangelist.sh% out %formfile%"
脚本核心代码片段:
mydesc=$'Jira Ticket: High level summary\n\t- Detailed change #1\n\t- Detailed change #2' case $opt in "out") sed -i "s|<enter description here>|$mydesc|" "$2" ;; # ... 其他逻辑 esac
问题根源
Linux系统中sh通常是dash的软链接,而dash不支持bash特有的ANSI-C转义字符串语法(即$'...'格式)。当用sh执行脚本时,$'Jira...'会被解析为字符$加上普通字符串'Jira...',导致描述开头多出$符号。
两种解决方法
方法1:修改触发器调用命令,用bash执行脚本
将触发器中的sh替换为bash,确保脚本用支持ANSI-C转义的bash解释器执行:
Triggers: desc-out form-out change "bash %//tools/main/Perforce/defaultChangelist.sh% out %formfile%"
方法2:替换ANSI-C转义语法,改用兼容所有shell的写法
如果无法修改触发器配置,可将脚本中的$'...'替换为printf生成多行字符串,兼容sh/dash:
# 替换原来的mydesc定义 mydesc=$(printf "Jira Ticket: High level summary\n\t- Detailed change #1\n\t- Detailed change #2")
或者直接写入带实际换行和制表符的字符串(需确保脚本编辑时保留换行):
mydesc="Jira Ticket: High level summary - Detailed change #1 - Detailed change #2"
验证效果
修改后,生成的变更描述将不再包含多余的$符号:
Jira Ticket: High level summary - Detailed change #1 - Detailed change #2
内容的提问来源于stack exchange,提问作者feltz
相关产品推荐
相关产品推荐

