Como ilustra la imagen, uso l
para obtener el archivo en la carpeta actual. Y luego quiero obtener el archivo con el número 1
, así que uso el pipe
y el grep
.
Pero, ¿por qué aparecen el archivo 2
y 22
? ¿Y cuál es el 1;34m
?
$ l
./ ../ 1 11 2 22
$ l | grep "1"
1;34m./ 1;32m../ 1 11 2 22
Actualizar
Ya he alias el comando l
en mi zshrc
archivo.
alias lsp="ls"
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'
alias ls="ls -alh --color"
Y aquí está el resultado del type
comando:
>$ type ls
ls is an alias for ls -alh --color
> $ type l
l is an alias for ls -CF
command-line
grep
ls
pipe
Sotavento
fuente
fuente
type -a l
?type ls
comando por favor? ¿has modificado ells
alias de alguna manera?Respuestas:
En primer lugar, lo que intentas hacer
l| grep <filename>
es malo. No lo hagas Este es el por qué.l
comando es realmente un alias parals -CF
Por defecto en Ubuntu
bash
,ls
es un alias parals --color=auto
. Como Steeldriver señaló en los comentarios,--color=auto
se supone que apaga la coloración. En su caso específico, tienealias ls="ls -alh --color"
yalias l="ls -CF"
, que básicamente termina siendols -alh --color -CF
. Esta combinación particular de interruptores aún envía salidas coloreadas a través de una tubería. Por ejemplo:Observe cómo los directorios
.
y..
tienen las mismas secuencias de escape.Qué significa todo esto
Esto significa que
l
generará una lista coloreada de archivos según el tipo de archivo. El problema es que la coloración ocurre con el uso de secuencias de escape . Eso es lo1:34m
que son las cosas: son secuencias de escape para colores específicos.El problema principal es que el análisis a
ls
menudo conduce a resultados incorrectos y desastres en los scripts, simplemente porquels
permite secuencias de escape como se explicó anteriormente y otros caracteres especiales. Consulte este artículo para obtener más información: http://mywiki.wooledge.org/ParsingLsLo que deberías estar haciendo:
Use el
find
comando:Podría hacer algo como esto con shell glob y el
[[
comando de prueba moderno :O tal vez use python, que tiene capacidades de manejo de nombre de archivo mucho mejores que
bash
soloSi no hay necesidad de procesar la salida
ls
, tambiénls
puede hacer el trabajo de forma simple . (Recuerde, esto es solo para ver la lista de archivos, no para pasarlo a otro programa para tratar el texto de salida)fuente
--color=always
también se especifica, ya sea como parte del alias paral
o en un alias anterior parals
sí mismo (reemplazando el valor predeterminadoalias ls='ls --color=auto'
).ls
en bash es por defecto?type ls
me da que es un alias parals --color=auto
auto
desactiva el color en una tubería AFAIK. Para ver secuencias de color ANSI, debe haberse cambiado a--color=always
, ya sea en ells
alias o en ell
aliasls --color
, no impide la coloración (también lo probé). Actualicé mi respuesta en consecuenciaSus
l
yls
comandos se configuran como alias.Cuando los ejecuta, canaliza la salida a través de
grep "1"
(usando|
) cada línea de pantalla donde1
aparece, con el1
color rojo.Debido a que los nombres de archivo
.
,..
,2
y22
aparecen en la misma línea de la pantalla, que son mostradas congrep
también, pero no aparecen en rojo que muestragrep
coincidencias.El
:34m
es una secuencia de escape para un color que no se pinta correctamente. Basado en su pregunta revisada con la salida detype -a l
ytype -a
se puede reproducir en mi sistema. Tenga en cuenta que debe cambiar su alias de--color
a--color=auto
:Salida de color
fuente
1:34m
cosas no son corrupción, son secuencias de escape utilizadas para colorear el texto. Ver mi respuesta en esa parte;)En su prueba, estaba llamando a su
ls
alias, por lo tanto, al1;34m
ruido similar que proviene de la coloración, y dado que la tubería|
recibe todo esto en la misma línea,grep
coincide con el archivo1
de esa línea y, en consecuencia, imprime esta línea. Esto es lo que ves en la pantalla.Cuando está haciendo cosas así, siempre es bueno volver al comando del sistema con 1 resultado por línea.
Para deshacerse de los alias, simplemente escriba
\ls
y use la opción-1
para imprimir resultados separados por saltos de línea.Nota: el método de barra invertida funciona con cada comando,
\command
solo llama al comando de sistema sin alias.fuente