2016-08-30 5 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 

자바 소스 파일 이름이"autogenerate.sh "되지 않습니다, 오히려 : 저장소에 확인

모든 자바 소스 파일의 상단에 추가됩니다 주석을 변경 ClassName.java "를 참조하십시오.

가 명확히 해명은, autogenerate.sh라는 다음과 같은 간단한 쉘 스크립트를 고려가 : 스크립트가 저장소에 체크인

#!/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이 쉘 변수로 확장되고 $FILENAME_IMPL 파일에는 정확한 $Id::$ 키워드 구조가 포함됩니다.

다른 방법으로 문제를 해결합니다. 원래 코드 $Id, $Date 및 기타는 셸에서 $FILENAME_IMPL으로 작성하기 전에 확장되었습니다. 이 코드를 사용하면 $FILENAME_IMPL의 출력이 예상 한 값이됩니다.