2009-05-08 13 views
53

He intentado varias formas de lo siguiente en una escritura del golpe:Cómo utilizar una variable de entorno dentro de una cadena entre comillas en Bash

#!/bin/bash 
svn diff [email protected] --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS" 

pero no puedo obtener la sintaxis correcta para expandir el entorno COLUMNS variable.

He intentado varias formas de lo siguiente:

svn diff [email protected] --diff-cmd /usr/bin/diff -x '-y -w -p -W $COLUMNS' 

y

svn diff [email protected] --diff-cmd /usr/bin/diff -x '-y -w -p -W ${COLUMNS}' 

y

eval svn diff [email protected] --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS" 

Sugerencias?

+0

¿Qué producen esos ejemplos en su caso? ¿Y qué quieres que produzcan? –

+0

el comando fuera del script está funcionando? – dfa

+0

¿Has probado 'svn diff $ @ --diff-cmd/usr/bin/diff -x" -y -w -p -W "" $ COLUMNS "' –

Respuesta

11

Si no está seguro, es posible utilizar la solicitud 'cols' en el terminal, y se olvida COLUMNAS:

COLS=$(tput cols) 
+0

Por alguna razón, esta es la única solución que pude obtener trabajando fuera de esta página (desde el 11 de mayo a las 10:38 ET). Gracias – Jamie

+0

En mi caso: comando -param "$ {VARIABLE} _ *" hizo el truco. – danger89

0

La siguiente secuencia de comandos funciona para mí con valores múltiples de $COLUMNS. Me pregunto si no está configurando COLUMNS antes de esta llamada?

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

¿Se puede hacer eco $COLUMNS dentro de la secuencia de comandos para ver si se configuró correctamente?

+0

Boo, hiss re: unquoted '$ @' - que divide un solo parámetro '" two words "' en dos parámetros separados, 'two' y' words'. Debería ser '" $ @ "' para pasar la lista de argumentos exactamente como se dio. –

0

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

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

exec /usr/bin/diff -x -y -w -p -W "$COLUMNS" "[email protected]" 

y sólo tiene que utilizar

svn diff "[email protected]" --diff-cmd diff-columns 

De esta manera el código es más limpio de leer y más modular (de arriba hacia abajo enfoque), y se puede probar la las columnas de diferencias codifican completamente por separado (enfoque ascendente).

+0

La línea de comandos se analiza antes de que se bifurque el proceso, por lo tanto, no exportar COLUMNAS no puede ser el problema. –

+1

Dice su código en parte de un script bash, por lo que puede ser el problema. –

12

Tenga en cuenta que es COLUMNS:

  1. NO una variable de entorno. Es un parámetro de bash ordinario que se establece por bash en sí mismo.
  2. Se establece automáticamente al recibir una señal SIGWINCH.

Ese segundo punto por lo general significa que la variable de COLUMNS sólo se encuentra en su shell interactivo, no en una escritura del golpe.

Si se conecta de stdin su guión a su terminal puede buscar manualmente el ancho de su terminal preguntando a su terminal:

tput cols 

Y para utilizar esto en su comando de SVN:

svn diff "[email protected]" --diff-cmd /usr/bin/diff -x "-y -w -p -W $(tput cols)" 

(Nota: se debe cita"[email protected]" y mantenerse alejado de eval ;-))

+0

Gracias por la información; saber qué está pasando trae un sentido de catarsis al problema. – Jamie

265

Solo una breve nota/resumen para cualquiera que haya venido aquí a través de Google buscando la respuesta a la pregunta general formulada en el título (como lo era yo). Cualquiera de los siguientes debe trabajar para conseguir el acceso a bombardear las variables entre comillas:

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

El uso de comillas simples es la cuestión principal. De acuerdo con la Bash Reference Manual:

Encerrar caracteres entre comillas simples (') preserva el valor literal de cada carácter dentro de las comillas. Es posible que una comilla simple no se produzca entre comillas simples, incluso cuando esté precedida por una barra diagonal inversa. [...] personajes que encierran entre comillas dobles (") preserva el valor literal de todos los caracteres dentro de las comillas, con la excepción de $, `, \, y, cuando la expansión de historia está activado, !. Los caracteres $ y `conservan su significado especial entre comillas dobles (ver Expansiones de Shell). La barra invertida conserva su significado especial solo cuando es seguida por uno de los siguientes caracteres: $, `, ", \, o nueva línea. Dentro de las comillas dobles, se eliminan las barras invertidas que son seguidas por uno de estos caracteres. Las barras diagonales anteriores a los caracteres sin un significado especial quedan sin modificar. Una comilla doble puede citarse entre 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 ! que aparece 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 (ver Expansión del parámetro de la carcasa).

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

+12

En el caso de comillas simples, tal vez esta solución ayude: ''antes de '" $ variable "' after'' (como se indica en esta respuesta: http://stackoverflow.com/a/13802438/2254346) – MakisH

+1

Maldita sea ¡Nunca supe esto de comillas simples! Me costó una tarde entera ... –

Cuestiones relacionadas