背景
一个shell脚本会生成许多Java源文件。源文件有一个包含Subversion关键字的特定标题注释。目标是检入shell脚本而不更改埋入其中的源文件头。抑制外壳脚本中的关键字扩展
问题
shell脚本包含自己的头,里面应该有关键字扩展:
#!/bin/bash
#
# Revision Control Information
# File: $Id:: autogenerate.sh 3142 2016-08-26 18:50:21Z USERNA#$
# Date of Last Commit: $Date:: 2016-08-26 11:50:21 -0700 (Fri, 26 Aug 2016) $
# Revision Number: $Rev:: 3142 $
# Last Commit by: $Author:: USERNAME $
这部分作品。失败的部分是当在shell脚本包括后来评论:
cat <<EOT >> $FILENAME_IMPL
/*
* *********************************************************************
* Revision Control Information
* File: $Id:: $
* Date of Last Commit: $Date:: $
* Revision Number: $Rev:: $
* Last Commit by: $Author:: $
*
* **********************************************************************
*/
package com.company.pkg;
EOT
在检查shell脚本到存储库中,第一组关键词是否正确扩大;但是,Java注释标题的关键字也会扩展。我曾经想过,一旦关键字被扩展,相同关键字的后续匹配将被忽略。不是这种情况。
检查到库中的变化将被添加到每个Java源文件的顶部注释:
cat <<EOT >> $FILENAME_IMPL
/*
* *********************************************************************
* Revision Control Information
* File: $Id:: autogenerate.sh $
* Date of Last Commit: $Date:: 2016-08-26 11:50:21 -0700 (Fri, 26 Aug 2016) $
* Revision Number: $Rev:: 1234 $
* Last Commit by: $Author:: USERNAME $
*
* **********************************************************************
*/
package com.company.pkg;
EOT
的Java源文件名不会是“autogenerate.sh”,而是“ ClassName.java”。
澄清
为了澄清,考虑称为autogenerate.sh
下面简单的shell脚本:
#!/bin/bash
# File: $Id:: $
FILENAME_IMPL=ClassName.java
cat <<EOT >> $FILENAME_IMPL
/* File: $Id:: $
*/
package com.company.pkg;
EOT
当脚本签入资料库,其内容变成:
#!/bin/bash
# File: $Id:: autogenerate.sh $
FILENAME_IMPL=ClassName.java
cat <<EOT >> $FILENAME_IMPL
/* File: $Id:: autogenerate.sh $
*/
package com.company.pkg;
EOT
第一$Id::
关键字被正确替换。第二个$Id::
关键字应该被忽略。换句话说,当我检查脚本到存储库,我想看看:
#!/bin/bash
# File: $Id:: autogenerate.sh $
FILENAME_IMPL=ClassName.java
cat <<EOT >> $FILENAME_IMPL
/* File: $Id:: $
*/
package com.company.pkg;
EOT
想法
逃离关键字没有帮助。例如:
cat <<EOT >> $FILENAME_IMPL
/* File: \$Id:: $
*/
package com.company.pkg;
EOT
问题
你将如何避免或消除为所有,但第一个匹配的关键字关键字扩展检查到Subversion版本库的时候?