¿Por qué "cat {foo}" no genera foo, pero sí "cat {foo, bar}"?

12

Intenté concatenar archivos de texto en subcarpetas e intenté:

cat ./{mainfolder1,mainfolder2,mainfolder3}/{subfolder1}/book.txt > out$var

Sin embargo, esto no devolvió nada. Entonces, intenté agregar una 'subcarpeta2' no existente

cat ./{mainfolder1,mainfolder2,mainfolder3}/{subfolder1,subfolder2}/book.txt > out$var

Y esta vez funcionó, concatenando los archivos con éxito. ¿Por qué sucede esto?

CDPF
fuente
2
Use en echolugar de catpara ver qué línea de comando tiene. (O usar set -xpara depurar)
Peter Cordes

Respuestas:

22

Por definición, la expansión de llaves en GNU Bash requiere una expresión de secuencia o una serie de valores separados por comas:

Los patrones que se van a expandir entre paréntesis toman la forma de un preámbulo opcional, seguido de una serie de cadenas separadas por comas o una expresión de secuencia entre un par de paréntesis, seguido de una posdata opcional.

Puede leer el manual para más detalles.

Algunas muestras simples:

echo {subfolder1}
{subfolder1}

echo {subfolder1,subfolder2}
subfolder1 subfolder2

echo subfolder{1}
subfolder{1}

echo subfolder{1..2}
subfolder1 subfolder2
Arthur Hess
fuente
21

{subfolder1}evalúa a {subfolder1}, ya que no hay alternativas. Usar en su subfolder1lugar.

Ignacio Vazquez-Abrams
fuente
2
Tenga en cuenta que es diferente de in csh(de donde proviene la expansión de llaves), tcsho fish.
Stéphane Chazelas
1

Las llaves solo se expandirán si tienen cadenas separadas por coma, por ejemplo, {abc, def} o rango, por ejemplo, {a..e} especificado entre ellas.

En su caso, puede escribir la subcarpeta1 sin encerrarla entre llaves, ya que no es necesario

cat ./{mainfolder1,mainfolder2,mainfolder3}/subfolder1/book.txt > out$var
Neo_Returns
fuente
Desafortunadamente, se /path/{a,}/filenameexpande a las dos cadenas /path/a/filenamey /path//filename, lo que puede ser no deseado.
Kusalananda
gracias @Kusalananda por rectificarme, sí bash proporcionará una advertencia que dice "redirección ambigua"
Neo_Returns
No, obtienes ambiguous redirect si intentas redirigir a un archivo dado por una variable sin comillas que no tiene valor, por ejemplo echo 'hello' >$idontexist.
Kusalananda
1
... o si el nombre de archivo en la redirección se expande a varias palabras. Al igual que > *.txtcon varios .txtarchivos, o > $filesi $filecontiene espacios en blanco. Pero, por supuesto, no hay nada ambiguo en dar catmúltiples argumentos
ilkkachu