Pregunta

He probado varias formas de lo siguiente en un script bash:

#!/bin/bash
svn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS"

Pero no puedo obtener la sintaxis para expandir correctamente la variable de entorno COLUMNS .

He probado varias formas de lo siguiente:

svn diff $@ --diff-cmd /usr/bin/diff -x '-y -w -p -W $COLUMNS'

y

svn diff $@ --diff-cmd /usr/bin/diff -x '-y -w -p -W ${COLUMNS}'

y

eval svn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS"

¿Sugerencias?

¿Fue útil?

Solución

Si no está seguro, puede utilizar la solicitud 'cols' en el terminal y olvidar COLUMNAS:

COLS=$(tput cols)

Otros consejos

Solo una nota / resumen rápido para cualquiera que haya venido aquí a través de Google en busca de la respuesta a la pregunta general que se hace en el título (como estaba yo). Cualquiera de los siguientes debería funcionar para obtener acceso a las variables de shell entre comillas:

echo "$VARIABLE"
echo "${VARIABLE}"

El uso de comillas simples es el problema principal. De acuerdo con el Manual de referencia de Bash :

  

Los caracteres encerrados entre comillas simples ( ') conservan el valor literal de cada carácter dentro de las comillas. Una comilla simple no puede aparecer entre comillas simples, incluso cuando está precedida por una barra invertida.   [...]   El encerrar caracteres entre comillas dobles ( " ) conserva el valor literal de todos los caracteres dentro de las comillas, con la excepción de $ , `, < code> \ y, cuando la expansión del historial está habilitada, ! . Los caracteres $ y `conservan su significado especial entre comillas dobles (ver Expansiones de Shell). La barra diagonal inversa conserva su significado especial solo cuando es seguida por uno de los siguientes caracteres: $ , `, " , \ o nueva línea. Entre comillas dobles, se eliminan las barras invertidas seguidas por uno de estos caracteres. Las barras diagonales anteriores que no tienen un significado especial no se modifican. Una comilla doble se puede citar dentro de comillas dobles precediéndola con una barra diagonal inversa. Si está habilitado, la expansión del historial se realizará a menos que se escape un ! entre comillas dobles usando una barra invertida. La barra invertida que precede al ! no se elimina.   Los parámetros especiales * y @ tienen un significado especial cuando están entre comillas dobles (vea Expansión de parámetros de Shell).

En el caso específico de la pregunta, $ COLUMNS es una variable especial que tiene propiedades no estándar (consulte la respuesta de lhunath más arriba).

Tenga en cuenta que COLUMNS es:

  1. NO una variable de entorno. Es un parámetro bash ordinario establecido por bash mismo.
  2. Configurar automáticamente al recibir una señal SIGWINCH .

Ese segundo punto generalmente significa que su variable COLUMNS solo se establecerá en su shell interactivo , no en un script bash.

Si el stdin de su script está conectado a su terminal, puede buscar manualmente el ancho de su terminal preguntando a su terminal:

tput cols

Y para usar esto en su comando SVN:

svn diff "$@" --diff-cmd /usr/bin/diff -x "-y -w -p -W $(tput cols)"

(Nota: debe citar " $ @ " y mantenerse alejado de eval ;-))

El siguiente script funciona para mí para múltiples valores de $ COLUMNS . Me pregunto si no está configurando COLUMNS antes de esta llamada

#!/bin/bash
COLUMNS=30
svn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS"

¿Puedes hacer eco de $ COLUMNS dentro de tu script para ver si se configuró correctamente?

Lo estás haciendo bien, así que supongo que algo más tiene la culpa (¿no exportar COLUMNAS?).

Un truco para depurar estos casos es hacer un comando especializado (un cierre para los chicos del lenguaje de programación). Cree un script de shell llamado diff-columnas haciendo:

exec /usr/bin/diff -x -y -w -p -W "$COLUMNS" "$@"

y solo use

svn diff "$@" --diff-cmd  diff-columns

De esta manera, su código es más claro para leer y más modular (enfoque de arriba hacia abajo), y puede probar el código de columnas de diferencias minuciosamente por separado (enfoque de abajo hacia arriba).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top