2016-08-30 25 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中的輸出將成爲您期望的結果。