Al repo
comando no le importa qué tipo de citas obtiene. Si necesita expansión de parámetros, use comillas dobles. Si eso significa que terminas teniendo que hacer una barra diagonal inversa de muchas cosas, usa comillas simples para la mayor parte, y luego sal de ellas y entra en dobles para la parte donde necesitas que ocurra la expansión.
repo forall -c 'literal stuff goes here; '"stuff with $parameters here"' more literal stuff'
La explicación sigue, si está interesado.
Cuando ejecuta un comando desde el shell, lo que ese comando recibe como argumentos es una matriz de cadenas terminadas en cero. Esas cadenas pueden contener absolutamente cualquier carácter no nulo.
Pero cuando el shell construye ese conjunto de cadenas desde una línea de comando, interpreta algunos caracteres especialmente; Esto está diseñado para hacer que los comandos sean más fáciles (de hecho, posibles) de escribir. Por ejemplo, los espacios normalmente indican el límite entre cadenas en la matriz; por esa razón, los argumentos individuales a veces se llaman "palabras". Pero, sin embargo, un argumento puede tener espacios; solo necesita alguna forma de decirle al shell que es lo que quiere.
Puedes usar una barra invertida delante de cualquier personaje (incluido el espacio u otra barra invertida) para indicarle al shell que trate a ese personaje literalmente. Pero si bien puedes hacer algo como esto:
echo \"Thank\ you.\ \ That\'ll\ be\ \$4.96,\ please,\"\ said\ the\ cashier
... puede ser agotador. Entonces el shell ofrece una alternativa: comillas. Estos vienen en dos variedades principales.
Las comillas dobles se denominan "comillas de agrupación". Evitan que se expandan los comodines y los alias, pero principalmente son para incluir espacios en una palabra. Otras cosas como la expansión de parámetros y comandos (el tipo de cosas señaladas por a $
) aún suceden. Y, por supuesto, si desea una comilla doble literal dentro de comillas dobles, debe hacer una barra diagonal inversa:
echo "\"Thank you. That'll be \$4.96, please,\" said the cashier"
Las comillas simples son más draconianas. Todo entre ellos se toma completamente literalmente, incluidas las barras invertidas. No hay absolutamente ninguna manera de obtener una comilla simple literal dentro de comillas simples.
Afortunadamente, las comillas en el shell no son delimitadores de palabras ; por sí mismos, no terminan una palabra. Puede entrar y salir de comillas, incluso entre diferentes tipos de comillas, dentro de la misma palabra para obtener el resultado deseado:
echo '"Thank you. That'\''ll be $4.96, please," said the cashier'
Así que eso es más fácil: muchas menos barras invertidas, aunque la secuencia de comillas cerradas, comillas simples literales, comillas simples, comillas abiertas y simples requiere algo de tiempo para acostumbrarse.
Los shells modernos han agregado otro estilo de comillas no especificado por el estándar POSIX, en el cual la comilla simple principal está precedida por un signo de dólar. Las cadenas así citadas siguen convenciones similares a los literales de cadena en el lenguaje de programación ANSI C y, por lo tanto, a veces se llaman "cadenas ANSI" y el $'
... '
par "citas ANSI". Dentro de tales cadenas, el consejo anterior sobre las barras invertidas literalmente ya no se aplica. En cambio, se vuelven especiales de nuevo: no solo puede incluir una comilla simple o una barra invertida literal al anteponer una barra invertida, sino que el shell también expande los escapes de caracteres ANSI C (como \n
para una nueva línea, \t
para tabulación y \xHH
para el personaje con código hexadecimalHH
) Sin embargo, de lo contrario, se comportan como cadenas entre comillas simples: no se realiza ninguna sustitución de parámetros o comandos:
echo $'"Thank you. That\'ll be $4.96, please," said the cashier'
Lo importante a tener en cuenta es que la cadena única recibida como argumento del echo
comando es exactamente la misma en todos estos ejemplos. Después de que el shell termine de analizar una línea de comando, no hay forma de que el comando que se ejecuta diga cómo se citó. Incluso si quisiera.
repo forall -c ' ...before... '"$variable"' ...after...'