2016-08-30 3 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 также расширены. Я думал, что как только ключевое слово будет расширено, последующие совпадения одного и того же ключевого слова будут проигнорированы. Это не тот случай.

Проверка в хранилище изменяет свой комментарий, который будет добавлен к началу каждого исходного файла 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:

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

Try:

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 будет тем, что вы ожидаете.

Смежные вопросы