Que fait la commande l?


19

Il y a une commande ldisponible sur ma machine qui semble ne rien faire. which lne produit également aucune sortie. Est-ce une vraie commande et fait-elle réellement quelque chose?

Réponses:


20

lest un alias pour ls -CF, qui se comporte différemment de plainls .

-C

-Crend lsla sortie d'impression sous forme de colonne. Lorsque stdout est un terminal (plutôt que d'être redirigé vers un fichier ou un périphérique non terminal, ou redirigé vers une autre commande), cela -Cest implicite. La course ls -Cest donc la même chose que la course ls. Mais ils ne sont pas équivalents lorsqu'ils lssont redirigés ou redirigés. Par exemple:

ek@Kip:~/firefox$ ls
application.ini             libfreebl3.chk    libxpcom.so
blocklist.xml               libfreebl3.so     libxul.so
chrome                      libmozalloc.so    mozilla-xremote-client
chrome.manifest             libmozsqlite3.so  omni.ja
components                  libnspr4.so       platform.ini
crashreporter               libnss3.so        plugin-container

...

ek@Kip:~/firefox$ ls | less

application.ini
blocklist.xml
chrome
chrome.manifest
components
crashreporter

...

En revanche, ls -C(ou -l) sort sous forme de colonne quel que soit le type d'appareil stdout. ls -C | lessressemble à la sortie supérieure (mais paginée par less, bien sûr).

-F

La principale différence visible entre lset lest due au -Fdrapeau, qui provoque l' lsajout de suffixes symboliques (appelés indicateurs) aux entrées qu'il affiche. Ces indicateurs identifient de quel type de fichier ou de répertoire il s'agit.

Comparez cela à la sortie de la première lscommande ci-dessus:

ek@Kip:~/firefox$ ls -F
application.ini             libfreebl3.chk     libxpcom.so*
blocklist.xml               libfreebl3.so*     libxul.so*
chrome/                     libmozalloc.so*    mozilla-xremote-client*
chrome.manifest             libmozsqlite3.so*  omni.ja
components/                 libnspr4.so*       platform.ini
crashreporter*              libnss3.so*        plugin-container*

...

Ici:

  • / signifie que l'entrée est un répertoire.
  • *signifie que l'entrée est un fichier normal et est exécutable (c.-à-d. possède des autorisations exécutables ).
  • L'absence de tout indicateur signifie que l'entrée est un fichier normal qui n'est pas exécutable.

Il existe plusieurs autres indicateurs:

Le --classifydrapeau et --indicator-style=classifysont équivalents à -F.

Source: Manuel GNU Coreutils , Section 10.1.5 Formatage général des sorties

En conclusion, l( ls -CF) est similaire mais pas identique à ls.

Il est également bon de garder à l'esprit:

Le même texte peut être à la fois une commande standard et un alias.

Ceci est couramment utilisé pour spécifier des options qui sont largement considérées à la fois comme très utiles et sans danger, telles que la colorisation automatique (où la couleur est appliquée lorsqu'elle stdoutn'est pas redirigée ou est un terminal, de sorte que les codes d'échappement spécifiant les couleurs sont pratiquement garantis pour ne pas être mal interprétés).

Par ce principe, lsest lui-même un alias.

ek@Kip:/$ alias ls
alias ls='ls --color=auto'

Alors, quelle commande est vraiment exécutée lorsque vous exécutez l? Celui-là:

/bin/ls --color=auto -CF
  1. Le shell ( bash) résout les commandes qui ne contiennent pas /de la première correspondance apparaissant dans PATH, ce qui dans Ubuntu for lsest /bin/ls.
  2. Les alias peuvent contenir des alias. La résolution d'alias n'est pas récursive (un alias ne peut pas s'appeler lui-même, bien qu'il puisse appeler une commande régulière portant le même nom). Mais il prend en charge l' imbrication .

lRésout donc à ls -CFqui se résout ls --color=auto -CF.

Les alias peuvent être modifiés.

Ces alias existent parce qu'ils sont configurés de cette façon par défaut, mais chaque utilisateur peut modifier ses alias. Reportez man alias-vous au chapitre 25 et à l' annexe M du Guide de script de script avancé et à la façon de sauvegarder à jamais mes entrées "d'alias" .

En relation: Que signifient les différentes couleurs dans ls?


6

En fait les deux lset lsont égaux

raja@badfox:~/Pictures$ l
des.png
Screenshot from 2012-09-22 19:37:03.png
Screenshot from 2012-09-22 19:37:11.png
Screenshot from 2012-09-22 19:37:12.png
Untitled.png
raja@badfox:~/Pictures$ ls
des.png
Screenshot from 2012-09-22 19:37:03.png
Screenshot from 2012-09-22 19:37:11.png
Screenshot from 2012-09-22 19:37:12.png
Untitled.png

pourquoi signifie qu'il y a un alias système intégré à l'origine de cela. si vous voulez voir, ouvrez votre terminal et tapez aliasalors vous obtiendrez une sortie comme celle-ci

raja@badfox:~/Pictures$ alias
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias lock='gnome-screensaver-command -l'
alias ls='ls --color=auto'
alias sms='php .sms.php'
raja@badfox:~/Pictures$ 

Mystère résolu :)
Armand

6
@Alison let plaine lssont pas les mêmes - ils ne se sont passées pour produire la même sortie pour les fichiers particuliers, car il n'y en avait des répertoires, des exécutables, des liens symboliques ou des noeuds de périphériques (et la sortie standard est un terminal).
Eliah Kagan

Vous pouvez voir, alias l='ls -CF'donc ce n'est pas pareil. De plus, si vous souhaitez obtenir une sortie plus succincte, vous pouvez exécuter alias l.
wjandrea

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.