背景
一個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版本庫的時候?