La relación entre ls
ydir
ls
y dir
son programas separados que se comportan de manera similar. Como se explica y hace referencia a continuación, el propósito de dir
es proporcionar un comando como ls
cuya salida no varía dependiendo de si va a un terminal o no . Para lograr esto de manera útil, dir
debe formatear su salida de manera razonable y útil tanto para ver en un terminal como para escribir en un archivo o canalización.
Hay dos conceptos erróneos comunes sobre dir
:
- Mucha gente cree que
dir
es un alias de ls
, pero ese no es el caso. Ninguno de los comandos es un alias del otro, y por defecto en Ubuntu, dir
no es un alias en absoluto. ls
y dir
son proporcionados por ejecutables separados, no idénticos.
- Mucha gente cree que
dir
existe por razones históricas oscuras o para proporcionar compatibilidad con algún estándar u otro sistema operativo. Ese tampoco es el caso. ls
se comporta como lo hace para la compatibilidad. dir
, que no tiene que ser compatible porque no es un comando estándar de Unix, se comporta de una manera alternativa que los desarrolladores consideran valioso por sí mismo y posiblemente incluso preferible.
OK, pero ¿exactamente cómo ls
y cómo dir
difieren?
Ambos ls
y dir
enumerar el contenido de los directorios. Dos diferencias específicas en sus comportamientos predeterminados los distinguen.
Cuando su salida estándar es una terminal, ls
enumera los nombres de los archivos en columnas ordenadas verticalmente (como ls -C
). Cuando su salida estándar no es una terminal (por ejemplo, un archivo o una tubería ), ls
enumera los nombres de los archivos uno por línea (como ls -1
).
Si su salida estándar es o no una terminal, dir
enumera los nombres de los archivos en columnas ordenadas verticalmente (como ls -C
).
Por tanto ls
y dir
, estos valores predeterminados pueden ser anulados por la --format=
bandera y por los -1
, -C
, -m
, y -x
banderas, que abrevian particulares --format=
opciones. Consulte 10.1.4 Formato de salida general en el manual de referencia de GNU coreutils para más detalles.
Cuando su salida estándar es un terminal y un nombre de archivo que se listará contiene caracteres de control , se ls
imprime en ?
lugar de cada carácter de control (como ls -q
). Cuando su salida estándar no es una terminal, ls
imprime los caracteres de control tal cual (como ls --show-control-chars
).
Ya sea que su salida estándar sea o no un terminal, cuando dir
encuentra un carácter de control o cualquier otro carácter que se interpretaría especialmente si se ingresara en un shell, imprime secuencias de barra invertida para los caracteres. Esto incluye incluso caracteres relativamente comunes como los espacios. Por ejemplo, dir
enumerará una entrada llamada Documents backups
como Documents\ backups
. Esto es como ls -b
.
Para ambos ls
y dir
, estos valores predeterminados pueden ser anulados por los indicadores enumerados en 10.1.7. Formateo de los nombres de archivo en el manual de referencia de GNU coreutils . Esto incluye -b
, -q
, --quoting-style=
, y algunos otros.
Fuentes : invocación ls e invocación dir , en el manual de referencia de GNU coreutils .
¿Por qué tener dir
?
La justificación de una dir
utilidad separada se da en 4.5 Estándares para interfaces Generalmente de los estándares de codificación GNU . Recomiendo leer toda la sección para comprender el razonamiento de los desarrolladores, pero aquí están los aspectos más destacados según corresponda a ls
/ dir
:
No haga que el comportamiento de una utilidad dependa del nombre utilizado para invocarla ...
En su lugar, use una opción de tiempo de ejecución o un interruptor de compilación o ambos para seleccionar entre los comportamientos alternativos ...
Del mismo modo, no haga que el comportamiento de un programa de línea de comandos dependa del tipo de dispositivo de salida ...
La compatibilidad requiere que ciertos programas dependan del tipo de dispositivo de salida. Sería desastroso si lo hiciera ls
o sh
no de la manera que todos los usuarios esperan. En algunos de estos casos, complementamos el programa con una versión alternativa preferida que no depende del tipo de dispositivo de salida. Por ejemplo, proporcionamos un dir
programa muy parecido,
ls
excepto que su formato de salida predeterminado es siempre un formato de varias columnas.
El Proyecto GNU considera indeseable, desde una perspectiva técnica, que una utilidad produzca resultados diferentes dependiendo de qué tipo de dispositivo está escribiendo (al menos en la configuración predeterminada de la utilidad). Para algunas utilidades, incluida la ls
salida dependiente del dispositivo, es necesaria para la compatibilidad, por lo que funciona de la manera que los usuarios esperan. Algunos usuarios también prefieren específicamente este comportamiento dependiente del dispositivo.
Si bien ls
no se pudo escribir razonablemente para comportar el dispositivo de forma independiente, dir
se creó una utilidad separada para lograr esto. Por lo tanto dir
no es la utilidad que comporta de forma extraña por razones de compatibility-- histórica ls
es .
Para ver cómo ls
, dir
y la relacionada vdir
utilidad se implementan en el código fuente coreutils sin duplicación innecesaria de código, vea ls-dir.c
, ls-ls.c
, ls-vdir.c
, ls.h
, y ls.c
.
¿Es dir
realmente útil?
Si alguna vez ha deseado ls
producir una salida de varias columnas, incluso cuando la canalizó a less
( ls | less
) o la redirigió a un archivo ( ls > out.txt
), puede usar dir
o ls -C
.
Si alguna vez ha deseado poder copiar directamente un nombre de archivo que se muestra ls
y usarlo como parte de un comando sin preocuparse por las citas , puede usar dir
o ls -b
.
dir
es equivalente a ls -Cb
, por lo que en ese sentido no es necesario dir
. Pero dir
proporciona una combinación de opciones que en la práctica a menudo es útil (aunque no se conoce ampliamente).
¿Por qué obtengo resultados coloreados de ls
(incluso ls -Cb
) pero no dir
?
La mayoría de los usuarios de Ubuntu tienen un alias llamado ls
que se ejecuta ls --color=auto
. Cuando ls
existe tanto como un alias como un comando externo, el alias tiene prioridad en los comandos simples e interactivos.
Las definiciones de alias no se expanden recursivamente: es el ls
comando externo con el que ls
está llamando el alias --color=auto
. Consulte 6.6 Alias en el manual de referencia de Bash para obtener más información sobre cómo funcionan los alias.
Cuando se pasa a ls
, dir
o vdir
(y algunos otros comandos, como grep
), --color=auto
usa color cuando su salida es un terminal, pero no de otra manera.
Por defecto en Ubuntu, las cuentas de usuario se crean con esto en ~/.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
Notarás que el ls
alias ( alias ls='ls --color=auto'
) no está comentado , mientras que los de dir
y vdir
están comentados, por #
lo que no tienen efecto. Es decir, si bien dir
no es un alias, ls
es (pero no lo es dir
) .
¿Cómo hago para que también se dir
produzcan resultados en color?
Para habilitar la salida en color con dir
, simplemente edite .bashrc
en su directorio de inicio y #alias dir='dir --color=auto'
elimine el comentario de la línea eliminando el encabezado #
. En los depósitos iniciados después del cambio, dir
habrá un alias.
Si desea el cambio en el shell actual, puede ejecutar la definición de alias como un comando, o puede obtenerla .bashrc
ejecutando . ~/.bashrc
.
Esto podría ir en contra del punto principal de dir
que debería producir el mismo tipo de salida independientemente del dispositivo de salida. Sin embargo:
- Si le resulta útil hacer este
dir
alias, debería hacerlo.
- Cuando se llama como un comando externo, por ejemplo en scripts o si anula el alias ejecutando
\dir
o command dir
, dir
seguirá produciendo una salida independiente del dispositivo. Esto quiere decir que el alias dir
a dir --color=auto
no se rompe realmente dir
.
dir --color
;)