Фон
Сценарий оболочки генерирует несколько исходных файлов 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?