Suprimir la expansión de palabras key en Shell Script

Fondo

Un script de shell genera una cantidad de files fuente de Java. Los files de origen tienen un comentario de encabezado particular que incluye palabras key de Subversion. El objective es incorporar la secuencia de commands del shell sin cambiar los encabezados de los files de origen enterrados.

Problema

El script de shell contiene su propio encabezado, que debe tener una expansión de palabras key:

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

Esta parte funciona La parte que falla es cuando un comentario se incluye más adelante en el script de 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 

Al verificar el script de shell en el repository, el primer set de palabras key se expande correctamente; sin embargo, las palabras key para el encabezado de comentario de Java también se expanden. Pensé que una vez que se amplió una palabra key, las coincidencias posteriores de la misma palabra key se ignorarían. Este no es el caso.

Al consultar en el repository, cambia el comentario que se agregará a la parte superior de cada file fuente de 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 

El nombre de file de la fuente Java no será "autogenerate.sh", sino "ClassName.java".

Aclaración

Para aclarar, considere la siguiente secuencia de commands de shell simple llamada autogenerate.sh :

 #!/bin/bash # File: $Id:: $ FILENAME_IMPL=ClassName.java cat <<EOT >> $FILENAME_IMPL /* File: $Id:: $ */ package com.company.pkg; EOT 

Cuando la secuencia de commands se registra en el repository, su contenido se convierte en:

 #!/bin/bash # File: $Id:: autogenerate.sh $ FILENAME_IMPL=ClassName.java cat <<EOT >> $FILENAME_IMPL /* File: $Id:: autogenerate.sh $ */ package com.company.pkg; EOT 

La primera palabra key $Id:: está correctamente sustituida. La segunda palabra key $Id:: debe ignorarse. En otras palabras, cuando reviso el script en el repository, me gustaría ver:

 #!/bin/bash # File: $Id:: autogenerate.sh $ FILENAME_IMPL=ClassName.java cat <<EOT >> $FILENAME_IMPL /* File: $Id:: $ */ package com.company.pkg; EOT 

Ideas

Escapar la palabra key no ayudó. Por ejemplo:

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

Pregunta

¿Cómo evitaría o suprimiría la expansión de palabras key para todas las palabras key que no coinciden con las primeras al ingresar a un repository de Subversion?

Tratar:

 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 

Cuando subversion procesa este script, ignorará $xId::$ porque xId no es una palabra key reconocida. Cuando se ejecuta el script, $xId se expandirá como una variable de shell y el file $FILENAME_IMPL tendrá la estructura de palabra key $Id::$ correcta en él.

Esto, por cierto, soluciona otro problema: en el código original, $Id shell, $Date y los demás fueron expandidos por el shell antes de que se escribieran en $FILENAME_IMPL . Con este código, la salida en $FILENAME_IMPL será la $FILENAME_IMPL .