Comme l'illustre l'image, j'utilise l
pour obtenir le fichier dans le dossier actuel. Et puis je veux obtenir le fichier avec un numéro 1
, donc j'utilise le pipe
et le grep
.
Mais pourquoi le fichier 2
et 22
s'affichent-ils? Et quel est le 1;34m
?
$ l
./ ../ 1 11 2 22
$ l | grep "1"
1;34m./ 1;32m../ 1 11 2 22
Mise à jour
J'ai déjà alias la commande l
dans mon zshrc
fichier.
alias lsp="ls"
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'
alias ls="ls -alh --color"
Et voici le résultat de la type
commande:
>$ type ls
ls is an alias for ls -alh --color
> $ type l
l is an alias for ls -CF
command-line
grep
ls
pipe
Lee
la source
la source
type -a l
?type ls
commande s'il vous plaît? avez-vous modifié l'ls
alias d'une manière ou d'une autre?Réponses:
Tout d'abord, ce que vous essayez de faire
l| grep <filename>
est mauvais. Ne le fais pas. Voici pourquoi.l
la commande est vraiment un alias pourls -CF
Par défaut dans Ubuntu
bash
,ls
est un alias dels --color=auto
. Comme l'a souligné Steeldriver dans les commentaires, il--color=auto
est censé désactiver la colorisation. Dans votre cas spécifique, vous avezalias ls="ls -alh --color"
etalias l="ls -CF"
, ce qui finit par êtrels -alh --color -CF
. Cette combinaison particulière de commutateurs envoie toujours une sortie colorisée sur un tuyau. Par exemple:Remarquez comment les répertoires
.
et..
ont les mêmes séquences d'échappement.Qu'est-ce-que tout cela veut dire
Cela signifie que
l
la liste colorisée des fichiers sortira en fonction du type de fichier. Le problème est que la colorisation se produit avec l'utilisation de séquences d'échappement . C'est ce que les1:34m
choses sont - ce sont des séquences d'échappement pour des couleurs spécifiques.Le problème principal est que l'analyse syntaxique
ls
conduit souvent à une sortie incorrecte et à des désastres dans les scripts, simplement parce quels
permet des séquences d'échappement comme expliqué précédemment et d'autres caractères spéciaux. Voir cet article pour plus d'informations: http://mywiki.wooledge.org/ParsingLsCe que vous devez faire:
Utilisez la
find
commande:Vous pouvez faire quelque chose comme ça avec shell glob et la
[[
commande de test moderne :Ou peut-être utiliser python, qui a de bien meilleures capacités de gestion de nom de fichier que
bash
seulS'il n'est pas nécessaire de traiter la sortie de
ls
, un simple globbing avecls
peut également faire le travail. (Rappelez-vous, c'est uniquement pour afficher la liste des fichiers, pas pour la passer à un autre programme pour gérer le texte de sortie)la source
--color=always
est également spécifiée - soit dans le cadre de l'alias pourl
ou dans un alias précédent pourls
lui-même (en remplaçant la valeur par défautalias ls='ls --color=auto'
).ls
dans bash par défaut?type ls
me donne que c'est un alias pourls --color=auto
auto
désactive la couleur dans un tube AFAIK. Pour voir les séquences de couleurs ANSI, il doit avoir été changé en--color=always
, soit dans l'ls
alias , soit dans l'l
aliasls --color
, n'empêche pas la colorisation (testé moi-même aussi). Mis à jour ma réponse en conséquenceVos commandes
l
etls
sont configurées en tant qu'alias.Lorsque vous les exécutez, la sortie passe par
grep "1"
(en utilisant|
) chaque ligne d'écran où1
apparaît s'affiche, avec la1
couleur rouge.Parce que les noms de fichiers
.
,..
,2
et22
apparaissent sur la même ligne d'écran, ils sont émis pargrep
aussi bien , mais ne semblent pas en rouge qui montregrep
matchs.Il
:34m
s'agit d'une séquence d'échappement pour une couleur qui ne peint pas correctement. Basé sur votre question révisée avec la sortie detype -a l
ettype -a
il peut être reproduit dans mon système. S'il vous plaît noter que vous devez changer votre alias de--color
pour--color=auto
:Sortie couleur
la source
1:34m
choses ne sont pas de la corruption, ce sont des séquences d'échappement utilisées pour la colorisation du texte. Voir ma réponse sur cette partie;)Dans votre essai, vous appeliez votre
ls
alias, donc le1;34m
bruit similaire provenant de la coloration, et puisque le tuyau|
reçoit tout cela sur la même ligne, ilgrep
correspond au fichier1
de cette ligne et imprime par conséquent cette ligne. Voici ce que vous voyez à l'écran.Lorsque vous faites des choses comme ça, il est toujours bon de revenir à la commande système avec 1 résultat par ligne.
Pour vous débarrasser des alias
\ls
, tapez simplement et utilisez l'option-1
pour imprimer les résultats séparés par des sauts de ligne.Remarque: la méthode de barre oblique inverse fonctionne avec chaque commande,
\command
appelle simplement la commande système sans biais.la source