(3 respuestas)
Cerrado hace 6 años.
Tengo un comando de búsqueda:
find Directory/{Alpha,Bravo,Charlie} arg1 arg2
Quiero reemplazar a Alpha,Bravo,Charlie
con $find_dir
find Directory/{$find_dir} arg1 arg2
sin embargo, este último se expande a
find Directory/{Alpha,Bravo,Charlie} arg1 arg2
más bien
find Directory/Alpha Directory/Bravo Directory/Charlie arg1 arg2
¿Por qué? Es parte de un script de bash bastante complejo que puede tener más o menos directorios, no todos los cuales son relevantes (por lo que no funcionaría subir/*). Entonces, si configuro tres ahora y agrego otro, tendré que agregarlo manualmente más tarde. Además, necesito que se ejecute desde la raíz de los directorios para mantener la perspectiva de los resultados encontrados (./Upload/Dir/file en lugar de ./Dir/file).
Pero usar una variable me permitiría cambiar eso según sea necesario y mantenerlo relevante para otras partes del script.
Respuesta aceptada:
Desde bash
documentación, sección Brace Expansion:
La expansión Brace se realiza antes que cualquier otra expansión, y cualquier
carácter especial de otras expansiones se conserva en el resultado . Es
estrictamente textual. Bash no aplica ninguna interpretación sintáctica
al contexto de la expansión o al texto entre llaves. Para
evitar conflictos con la expansión de parámetros, la cadena '${' no se considera
elegible para la expansión de llaves.
Otra nota, en bash
:
El orden de las expansiones es:expansión de llaves, expansión de tilde,
parámetro, variable y expansión aritmética y sustitución de comandos (realizado de izquierda a derecha) , división de palabras y expansión de nombre de archivo
.
Entonces, en tu caso, bash
vio expansión de llave antes de la expansión variable, hará la expansión de llave primero, producirá el resultado {Alpha,Bravo,Charlie}
.
Si puedes controlar $find_dir
contenido variable, puede usar eval
:
eval "find Directory/{$find_dir} arg1 arg2"