Como ilustra la imagen, uso lpara obtener el archivo en la carpeta actual. Y luego quiero obtener el archivo con el número 1, así que uso el pipey el grep.
Pero, ¿por qué aparecen el archivo 2y 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 len mi zshrcarchivo.
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 typecomando:
>$ 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 lscomando por favor? ¿has modificado ellsalias de alguna manera?Respuestas:
En primer lugar, lo que intentas hacer
l| grep <filename>es malo. No lo hagas Este es el por qué.lcomando es realmente un alias parals -CFPor defecto en Ubuntu
bash,lses un alias parals --color=auto. Como Steeldriver señaló en los comentarios,--color=autose 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
lgenerará 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:34mque son las cosas: son secuencias de escape para colores específicos.El problema principal es que el análisis a
lsmenudo conduce a resultados incorrectos y desastres en los scripts, simplemente porquelspermite 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
findcomando: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
bashsoloSi no hay necesidad de procesar la salida
ls, tambiénlspuede 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=alwaystambién se especifica, ya sea como parte del alias paralo en un alias anterior paralssí mismo (reemplazando el valor predeterminadoalias ls='ls --color=auto').lsen bash es por defecto?type lsme da que es un alias parals --color=autoautodesactiva el color en una tubería AFAIK. Para ver secuencias de color ANSI, debe haberse cambiado a--color=always, ya sea en ellsalias o en ellaliasls --color, no impide la coloración (también lo probé). Actualicé mi respuesta en consecuenciaSus
lylscomandos se configuran como alias.Cuando los ejecuta, canaliza la salida a través de
grep "1"(usando|) cada línea de pantalla donde1aparece, con el1color rojo.Debido a que los nombres de archivo
.,..,2y22aparecen en la misma línea de la pantalla, que son mostradas congreptambién, pero no aparecen en rojo que muestragrepcoincidencias.El
:34mes una secuencia de escape para un color que no se pinta correctamente. Basado en su pregunta revisada con la salida detype -a lytype -ase puede reproducir en mi sistema. Tenga en cuenta que debe cambiar su alias de--colora--color=auto:Salida de color
fuente
1:34mcosas 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
lsalias, por lo tanto, al1;34mruido similar que proviene de la coloración, y dado que la tubería|recibe todo esto en la misma línea,grepcoincide con el archivo1de 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
\lsy use la opción-1para imprimir resultados separados por saltos de línea.Nota: el método de barra invertida funciona con cada comando,
\commandsolo llama al comando de sistema sin alias.fuente