2016-08-30 11 views
4

背景

シェルスクリプトは、Javaソース・ファイルの数を生成します。ソースファイルには、Subversionキーワードを含む特定のヘッダコメントがあります。目標は、内部に埋め込まれたソースファイルのヘッダーを変更せずにシェルスクリプトをチェックインすることです。を抑止キーワード展開シェルスクリプトで

問題

シェルスクリプトは、キーワード拡張を持っている必要があり、独自のヘッダー、含まれています

#!/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          $ 

この部分作品を。コメントはシェルスクリプトの後半に含まれている場合に失敗する部分がある:

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 

リポジトリにシェルスクリプトをチェックし、キーワードの最初のセットが正しく展開されています。ただし、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」ではありませんが、むしろ:リポジトリにチェックイン

は、すべてのJavaソースファイルの先頭に追加されたコメントを変更しますClassName.java "明確にするために

明確化

autogenerate.shと呼ばれる次のような単純なシェルスクリプトを検討:最初

#!/bin/bash 
# File:    $Id:: autogenerate.sh $ 

FILENAME_IMPL=ClassName.java 

cat <<EOT >> $FILENAME_IMPL 
/* File:    $Id:: autogenerate.sh $ 
*/ 
package com.company.pkg; 
EOT 

#!/bin/bash 
# File:    $Id:: $ 

FILENAME_IMPL=ClassName.java 

cat <<EOT >> $FILENAME_IMPL 
/* File:    $Id:: $ 
*/ 
package com.company.pkg; 
EOT 

スクリプトがリポジトリにチェックされている場合は、その内容になると$Id::キーワードが正しく置き換えられました。 2番目の$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

試してください:Subversionはこのスクリプトを処理するときxIdが認識キーワードではありませんので、

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はシェル変数として展開され、ファイル$FILENAME_IMPLは正しい$Id::$キーワード構造を持ちます。

これは、方法によって、別の問題が修正されています。彼らは$FILENAME_IMPLに書かれていた前に、元のコード、$Id$Date、および他でシェルによって拡大しました。このコードでは、$FILENAME_IMPLの出力が期待どおりになります。

関連する問題