1 votos

Brace Expansión en comillas

Entiendo que la llave de expansión en Bash se expanda a varios argumentos. ¿Puede ampliar a un solo argumento?

Hay una solución pura de esto en Bash, sin tener que recurrir a la anidados echo?

Comportamiento Real De

command arg{1,2,3}

$1 = arg1
$2 = arg2
$3 = arg3

Comportamiento Deseado

$1 = arg1 arg2 arg3
$2 = 
$3 = 

No De La Solución

command "arg{1,2,3}"

$1 = arg{1,2,3}
$2 = 
$3 = 

Posible Solución (un poco de hack-y?)

command "$(echo arg{1,2,3})"

$1 = arg1 arg2 arg3
$2 = 
$3 = 

3voto

dessert Puntos 928

La expansión arg{1,2,3} a arg1 arg2 arg3 se llama Llave de Expansión, y que se divide en tres palabras es llamado la Palabra de División y la inserción de la salida de un comando de Sustitución de Comandos. man bash dice:

El orden de las expansiones es: llave de expansión; tilde de expansión, parámetro y variable expansión, expansión aritmética, y la sustitución de comandos (hecho en una de izquierda a derecha la moda); palabra de división; y la ruta de expansión.

En una línea de comandos como

printf %s\\n {1..3}

Llave de Expansión que ocurra primero y hace

printf %s\\n 1 2 3

donde 1, 2 y 3 son palabras separadas gracias a la Palabra de Dividir. No hay nada que puedas hacer para cambiar este orden – como usted ha experimentado, citando no sólo prevenir la Palabra División, pero la Llave de Expansión así. Sin embargo, puede utilizar la Sustitución de Comandos para obtener una Llave de Expansión, incluso dentro de las comillas dobles:

Si el [comando] la sustitución aparece dentro de comillas dobles, palabra de la división de y el nombre de ruta de la expansión no se realiza en los resultados.

En

printf %s\\n "$(echo {1..3})"

el interior de las citas se expande primero

printf %s\\n "$(echo 1 2 3)"
printf %s\\n "1 2 3"

y como el resultado es citado no se sujeta a la Palabra de Dividir:

$ printf %s\\n {1..3} "{1..3}" "$(echo {1..3})" # prints one argument per line
1
2
3
{1..3}
1 2 3

Este hecho no es sólo la forma más sencilla de hacer esto, pero también un puro bash solución, como echo es bash builtin.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: