2016-08-30 51 views
4

背景

一个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版本库的时候?

回答

3

尝试:

xId='$Id'; xDate='$Date'; xRev='$Rev'; xAuthor='$Author' 
cat <<EOT >> "$FILENAME_IMPL" 
/* 
* ********************************************************************* 
* Revision Control Information 
* File:    $xId::           $ 
* Date of Last Commit: $xDate::          $ 
* Revision Number:  $xRev::          $ 
* Last Commit by:  $xAuthor::          $ 
* 
* ********************************************************************** 
*/ 
package com.company.pkg; 
EOT 

颠覆时处理该脚本,它将忽略$xId::$因为xId没有一个公认的关键字。脚本运行时,$xId将作为shell变量扩展,文件$FILENAME_IMPL将具有正确的$Id::$关键字结构。

这顺便解决了另一个问题:在原始代码中,$Id,$Date,其他的被shell在扩展之前被写入$FILENAME_IMPL。通过此代码,$FILENAME_IMPL中的输出将成为您期望的结果。