La relation entre lsetdir
lset dirsont des programmes distincts qui se comportent de la même manière. Comme expliqué et référencé ci-dessous, le but de direst de fournir une commande du type lsdont la sortie ne varie pas selon qu’elle va ou non à un terminal . Pour y parvenir utilement, il dirfaut 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
dirc'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 dirn'est pas du tout un alias. lset dirsont fournis par des exécutables distincts non identiques.
- Beaucoup de gens croient qu’il
direxiste 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. lsse 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 lset dirdiffèrent?
Les deux lset dirlistent 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, lsré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 ), lsliste les noms de fichiers un par ligne (comme ls -1).
Que sa sortie standard soit ou non un terminal, dirrépertorie les noms de fichiers dans des colonnes triées verticalement (comme ls -C).
Pour les deux lset dir, ces valeurs par défaut peuvent être remplacés par le --format=drapeau et les -1, -C, -met des -xdrapeaux, 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 lsimprimé à la ?place de chaque caractère de contrôle (comme ls -q). Lorsque sa sortie standard n’est pas un terminal, lsaffiche les caractères de contrôle tels ls --show-control-charsquels.
Que sa sortie standard soit ou non un terminal, lorsqu'elle dirrencontre 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, dirlistera une entrée appelée Documents backupscomme Documents\ backups. C'est comme ls -b.
Pour les deux lset 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 dirutilitaire 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 lsou de shne 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 dirprogramme 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 lsne soit pas raisonnable d'écrire pour se comporter de manière indépendante, un dirutilitaire distinct a été créé à cette fin. Ainsi, dirl’utilité qui se comporte étrangement pour des raisons de compatibilité historique ne l’ lsest pas .
Pour voir comment ls, diret le connexe vdirutilitaire 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.het ls.c.
Est-ce dirvraiment utile?
Si vous avez déjà souhaité lsproduire 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 dirou ls -C.
Si vous avez déjà souhaité, vous pouvez directement copier un nom de fichier indiqué par lset l’utiliser dans le cadre d’une commande sans vous soucier de la citer , vous pouvez utiliser dirou ls -b.
direst équivalent à ls -Cb, donc dans ce sens vous n'avez pas besoin dir. Mais dirfournit 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é lsqui fonctionne ls --color=auto. Lorsqu'il lsexiste à 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 lscommande externe avec laquelle l' lsalias 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, dirou vdir(et à d’autres commandes, par exemple grep), --color=autoutilise 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 lspseudonyme ( alias ls='ls --color=auto') n'est pas commenté , tandis que ceux pour diret vdirsont commentés #afin qu'ils ne prennent aucun effet. Autrement dit, tout dirn'est pas un alias, lsest (mais pas dir) .
Comment puis-je aussi dirproduire des sorties colorées?
Pour activer la sortie en couleur avec dir, éditez simplement .bashrcdans 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 dirsera 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 .bashrcen 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
diralias, 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
\dirou command dir, dirproduira toujours une sortie indépendante du périphérique. C'est-à-dire que l'aliasing dirto dir --color=autone casse pas vraiment dir.
dir --color;)