¿Hay alguna diferencia entre las secuencias {1,2,3}
y {1..3}
?
Por ejemplo si tengo algunos archivos
file.1
file.2
file.3
y los quiero cat
juntos ¿es seguro usarlos cat file.{1..3} > file
?
Lo que sé es que cat file.*>file
podría causar problemas porque el shell puede expandir los archivos de forma aleatoria a veces (creo que esto depende de los inodes, ¿no?)
cat file.[123] >file
file.*
no depende de los inodes. Siempre los ordena lexicográficamente, lo que podría depender de su configuración de localización.file.{1..3}
que se expande a los tres si existen o no.cat
erroresfile.[123] not found
o algo muy útil.Respuestas:
{1..3}
y{1,2,3}
producen el mismo resultado, pero de manera diferente.En general,
{n1..n2}
(que fue primero dezsh
,bash
yksh
copiado más tarde) donden1
yn2
son números enteros que producen todos los números entren1
yn2
. Mientras{x,y,z}
producen tres personajesx
,y
yz
.En su caso, es seguro usar
cat file.{1..3} > file
Ahora, en el caso de
cat file.*>file
, usó el globbing de shell , que produce el inicio de todos los nombres de archivofile.
y el resultado se ordenará según el orden de clasificación en el entorno local actual.Todavía está a salvo, pero ya no cuando tiene más de 10 archivos.
{1..10}
le dará1 2 3 4 5 6 7 8 9 10
. Mientras que con globbing, obtendrás1 10 2 3 4 5 6 7 8 9
fuente
La diferencia es que una es una lista y la otra una secuencia.
{1,2,3}
expande a tres elementos específicos,1
,2
, y3
.{1..3}
se expande a la lista de números entre uno y tres. En este caso particular, son iguales y puede usar cualquiera de los dos.file.*
se expandirá a todos los archivos y directorios en el directorio actual cuyo nombre comienza confile.
. Si solo tienesfile.1
,file.2
yfile.3
eso también es equivalente a los otros dos.En cuanto a que causa problemas, no veo por qué. Tal vez estés pensando en
Eso, sin embargo, es un tema completamente diferente. El único otro problema que se me ocurre es que su shell podría no enumerar los archivos en el orden correcto. Por ejemplo:
Para resolver eso, puede usar en
zsh
lugar debash
(ver aquí para más detalles):En general, los tres enfoques no son lo mismo. Depende de lo que quieras hacer. En los casos en que los tres devuelven la misma salida, sí, puede usar cualquiera de ellos. No hace ninguna diferencia. Todas estas expansiones las realiza el shell y suceden antes de pasarlas a cualquier comando que las use.
fuente
*
si tuviera más o igual a 10 archivos, si dependiera del orden correcto?ARG_MAX
archivos, pero eso será mucho más que 10.cat *
no está bien definida. El resultado depende del shell y del entorno. Ver el comentario de Sebastian ..txt
resolver el problema confile.*
?Son iguales, pero depende de la versión de bash que haya instalado si están disponibles.
Desde esta página:
fuente