La relation entre ls
etdir
ls
et dir
sont des programmes distincts qui se comportent de la même manière. Comme expliqué et référencé ci-dessous, le but de dir
est de fournir une commande du type ls
dont la sortie ne varie pas selon qu’elle va ou non à un terminal . Pour y parvenir utilement, il dir
faut formater sa sortie de manière raisonnable et utile à la fois pour l'affichage dans un terminal et pour l'écriture dans un fichier ou un canal.
Il existe deux idées fausses sur les points suivants dir
:
- Beaucoup de gens croient que
dir
c'est un pseudonyme ls
, mais ce n'est pas le cas. Aucune commande n'est un alias de l'autre, et par défaut dans Ubuntu, ce dir
n'est pas du tout un alias. ls
et dir
sont fournis par des exécutables distincts non identiques.
- Beaucoup de gens croient qu’il
dir
existe pour des raisons historiques obscures ou pour assurer la compatibilité avec un système d’exploitation standard ou autre. Ce n'est pas le cas non plus. ls
se comporte comme il le fait pour la compatibilité. dir
, qui n’a pas besoin d’être compatible car ce n’est pas une commande Unix standard, se comporte de manière différente, ce que les développeurs considèrent comme précieux et peut-être même préférable.
OK, mais exactement comment ls
et dir
diffèrent?
Les deux ls
et dir
listent le contenu des répertoires. Deux différences spécifiques dans leurs comportements par défaut les distinguent.
Lorsque sa sortie standard est un terminal, ls
répertorie les noms de fichiers dans des colonnes triées verticalement (comme ls -C
). Lorsque sa sortie standard n'est pas un terminal (par exemple, un fichier ou un canal ), ls
liste les noms de fichiers un par ligne (comme ls -1
).
Que sa sortie standard soit ou non un terminal, dir
répertorie les noms de fichiers dans des colonnes triées verticalement (comme ls -C
).
Pour les deux ls
et dir
, ces valeurs par défaut peuvent être remplacés par le --format=
drapeau et les -1
, -C
, -m
et des -x
drapeaux, qui Abréger particulières --format=
options. Voir 10.1.4 Formatage général des sorties dans le manuel de référence de GNU coreutils pour plus de détails.
Lorsque sa sortie standard est un terminal et qu'un nom de fichier à répertorier contient des caractères de contrôle , est ls
imprimé à la ?
place de chaque caractère de contrôle (comme ls -q
). Lorsque sa sortie standard n’est pas un terminal, ls
affiche les caractères de contrôle tels ls --show-control-chars
quels.
Que sa sortie standard soit ou non un terminal, lorsqu'elle dir
rencontre un caractère de contrôle ou tout autre caractère qui serait interprété spécialement si elle était entrée dans un shell, elle imprime des séquences de barres obliques inverses pour les caractères. Cela inclut même des caractères relativement communs tels que des espaces. Par exemple, dir
listera une entrée appelée Documents backups
comme Documents\ backups
. C'est comme ls -b
.
Pour les deux ls
et dir
, ces valeurs par défaut peuvent être remplacées par les drapeaux listés dans 10.1.7 Formater les noms de fichiers dans le manuel de référence de GNU coreutils . Cela inclut -b
, -q
, --quoting-style=
et quelques autres.
Sources : ls invocation et invocation dir , dans le manuel de référence de GNU coreutils .
Pourquoi dir
?
La justification d'un dir
utilitaire distinct est donnée dans 4.5 Normes d'interface généralement des normes de codage GNU . Je recommande de lire toute cette section pour comprendre le raisonnement des développeurs, mais voici les points saillants applicables à ls
/ dir
:
S'il vous plaît, ne faites pas dépendre le comportement d'un utilitaire du nom utilisé pour l'invoquer ....
Au lieu de cela, utilisez une option d'exécution ou un commutateur de compilation ou les deux pour sélectionner l'un des comportements alternatifs ....
De même, veuillez ne pas associer le comportement d'un programme en ligne de commande au type de périphérique de sortie ....
La compatibilité nécessite que certains programmes dépendent du type de périphérique de sortie. Il serait désastreux de le faire ls
ou de sh
ne pas le faire de la manière attendue par tous les utilisateurs. Dans certains cas, nous complétons le programme avec une version alternative préférée, qui ne dépend pas du type de périphérique de sortie. Par exemple, nous fournissons un dir
programme très similaire
ls
à celui mis à part que son format de sortie par défaut est toujours un format multi-colonnes.
Le projet GNU considère qu'il n'est pas souhaitable, d'un point de vue technique, qu'un utilitaire produise une sortie différente en fonction du type de périphérique sur lequel il écrit (du moins dans la configuration par défaut de cet utilitaire). Pour certains utilitaires, notamment ls
, une sortie dépend de l'appareil est nécessaire pour la compatibilité et fonctionne donc comme prévu. Certains utilisateurs préfèrent également spécifiquement ce comportement dépendant du périphérique.
Bien qu'il ls
ne soit pas raisonnable d'écrire pour se comporter de manière indépendante, un dir
utilitaire distinct a été créé à cette fin. Ainsi, dir
l’utilité qui se comporte étrangement pour des raisons de compatibilité historique ne l’ ls
est pas .
Pour voir comment ls
, dir
et le connexe vdir
utilitaire sont mis en œuvre dans le code source coreutils sans duplication de code inutile, voir ls-dir.c
, ls-ls.c
, ls-vdir.c
, ls.h
et ls.c
.
Est-ce dir
vraiment utile?
Si vous avez déjà souhaité ls
produire une sortie multi-colonne, même lorsque vous l'avez transmise à less
( ls | less
) ou redirigée vers un fichier ( ls > out.txt
), vous pouvez utiliser dir
ou ls -C
.
Si vous avez déjà souhaité, vous pouvez directement copier un nom de fichier indiqué par ls
et l’utiliser dans le cadre d’une commande sans vous soucier de la citer , vous pouvez utiliser dir
ou ls -b
.
dir
est équivalent à ls -Cb
, donc dans ce sens vous n'avez pas besoin dir
. Mais dir
fournit une combinaison d'options qui, dans la pratique, sont souvent utiles (bien que peu connues).
Pourquoi ai-je une sortie colorisée de ls
(même ls -Cb
) mais pas dir
?!
La plupart des utilisateurs Ubuntu ont un alias appelé ls
qui fonctionne ls --color=auto
. Lorsqu'il ls
existe à la fois comme alias et comme commande externe, l'alias a la priorité dans les commandes simples et interactives.
Les définitions d'alias ne sont pas développées de manière récursive - c'est la ls
commande externe avec laquelle l' ls
alias appelle --color=auto
. Voir 6.6 Alias dans le manuel de référence Bash pour plus d'informations sur le fonctionnement des alias.
Lorsque passé à ls
, dir
ou vdir
(et à d’autres commandes, par exemple grep
), --color=auto
utilise color lorsque son résultat est un terminal, mais pas autrement.
Par défaut dans Ubuntu, les comptes d'utilisateurs sont créés avec ceci dans ~/.bashrc
:
# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
alias ls='ls --color=auto'
#alias dir='dir --color=auto'
#alias vdir='vdir --color=auto'
alias grep='grep --color=auto'
alias fgrep='fgrep --color=auto'
alias egrep='egrep --color=auto'
fi
Vous remarquerez que le ls
pseudonyme ( alias ls='ls --color=auto'
) n'est pas commenté , tandis que ceux pour dir
et vdir
sont commentés #
afin qu'ils ne prennent aucun effet. Autrement dit, tout dir
n'est pas un alias, ls
est (mais pas dir
) .
Comment puis-je aussi dir
produire des sorties colorées?
Pour activer la sortie en couleur avec dir
, éditez simplement .bashrc
dans votre répertoire personnel et #alias dir='dir --color=auto'
supprimez la mise en commentaire de la ligne en supprimant l’entrée #
. Dans les obus commencés après le changement, ce dir
sera un alias.
Si vous souhaitez modifier le shell en cours, vous pouvez exécuter la définition d'alias en tant que commande ou vous pouvez créer une source .bashrc
en exécutant . ~/.bashrc
.
Cela va sans doute à l’encontre du point principal de dir
- qu’il devrait produire le même type de sortie quel que soit le périphérique de sortie. Pourtant:
- Si vous trouvez utile de faire cet
dir
alias, vous devriez le faire.
- Lorsqu'elle est appelée en tant que commande externe, par exemple dans des scripts ou si vous remplacez l'alias par exécution
\dir
ou command dir
, dir
produira toujours une sortie indépendante du périphérique. C'est-à-dire que l'aliasing dir
to dir --color=auto
ne casse pas vraiment dir
.
dir --color
;)