He estado tratando de encontrar la diferencia entre usar los comandos dir
y ls
en la terminal. Sé que ls es el método tradicional de UNIX para ver los archivos en un directorio, y ese dir
es el símbolo del sistema de Windows equivalente, pero ambos comandos funcionan en la terminal.
Si escribo dir
, muestra los archivos y las carpetas en el directorio, y si escribo ls
hace lo mismo, excepto con resaltado de contenido. Ambos comandos aceptan opciones (es decir, ls -a
y dir -a
ambos devuelven todos los archivos y carpetas y archivos ocultos).
Así que ¿alguien sabe cuál es la diferencia y por qué tanto dir
y ls
se utilizan?
command-line
directory
ls
coreutils
BretD
fuente
fuente
dir --color
;)Respuestas:
dir
yls
son parte decoreutils
ydir
es casi lo mismo quels
, solo que con diferentes opciones predeterminadas.info dir
dice:¡Ah, y también hay
vdir
!info vdir
dice:Lo más probable es que
dir
exista por compatibilidad con versiones anteriores o por razones históricas.fuente
alias dir
para ver qué es realmente. escribaalias
para ver todos los alias.type dir
para ver qué es (un alias, un comando, una función bash ...)La relación entre
ls
ydir
ls
ydir
son programas separados que se comportan de manera similar. Como se explica y hace referencia a continuación, el propósito dedir
es proporcionar un comando comols
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
:dir
es un alias dels
, 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
ydir
son proporcionados por ejecutables separados, no idénticos.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ómodir
difieren?Ambos
ls
ydir
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 (comols -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 (comols -1
).Si su salida estándar es o no una terminal,
dir
enumera los nombres de los archivos en columnas ordenadas verticalmente (comols -C
).Por tanto
ls
ydir
, 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 (comols -q
). Cuando su salida estándar no es una terminal,ls
imprime los caracteres de control tal cual (comols --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 llamadaDocuments backups
comoDocuments\ backups
. Esto es comols -b
.Para ambos
ls
ydir
, 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 als
/dir
: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 tantodir
no es la utilidad que comporta de forma extraña por razones de compatibility-- históricals
es .Para ver cómo
ls
,dir
y la relacionadavdir
utilidad se implementan en el código fuente coreutils sin duplicación innecesaria de código, veals-dir.c
,ls-ls.c
,ls-vdir.c
,ls.h
, yls.c
.¿Es
dir
realmente útil?Si alguna vez ha deseado
ls
producir una salida de varias columnas, incluso cuando la canalizó aless
(ls | less
) o la redirigió a un archivo (ls > out.txt
), puede usardir
ols -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 usardir
ols -b
.dir
es equivalente als -Cb
, por lo que en ese sentido no es necesariodir
. Perodir
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
(inclusols -Cb
) pero nodir
?La mayoría de los usuarios de Ubuntu tienen un alias llamado
ls
que se ejecutals --color=auto
. Cuandols
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 quels
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
ovdir
(y algunos otros comandos, comogrep
),--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
:Notarás que el
ls
alias (alias ls='ls --color=auto'
) no está comentado , mientras que los dedir
yvdir
están comentados, por#
lo que no tienen efecto. Es decir, si biendir
no es un alias,ls
es (pero no lo esdir
) .¿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:dir
alias, debería hacerlo.\dir
ocommand dir
,dir
seguirá produciendo una salida independiente del dispositivo. Esto quiere decir que el aliasdir
adir --color=auto
no se rompe realmentedir
.fuente
Fuente: la respuesta de Renan a ¿Cuál es la diferencia entre "dir" y "ls" ?
fuente
dir
se no se proporciona por compatibilidad hacia atrás -yls
de hecho es --este respuesta (y la respuesta se cita) no indicar correctamente la diferencia técnica entre los dos comandos, así como la explicación de la diferencia de coloración comúnmente observados. Entonces +1.En caso de duda, compare
type ls
vstype dir
(vea también Diferencia entre ls y la ):La diferencia se reduce a diferentes opciones para
ls
, en mi caso--color=tty
, sería la más visible, su sistema puede diferir.fuente
ls
un alias para una función llamada_ls
, ni siquiera como una línea comentada.bashrc
. Sin embargo, parece ser el valor predeterminado para (al menos algunas versiones de) openSuSE, a juzgar por esta conversación , este archivo (vinculado desde allí) y mi memoria (es probable que sea incorrecta) de la última vez que utilicé openSUSE.Respuesta corta: Ninguno,
dir
es el mismo que el código fuentels
,ls
binario tiene--color
por defecto. (1 línea de código dif.)fuente
dir
es no un alias dels
. Son binarios separados/usr/bin
que se comportan de manera diferente, como se describe en la respuesta de Rinzwind . Podría lograr esto con alias, pero no es así como se logra. Aparecen binarios y separados en todos los sistemas que usan GNU Coreutils . Si necesitas pruebas, corre .dir
ls
cmp /bin/ls /bin/dir
alias
, ahora se compila un nuevo binario para dir. Puede descargar su código con:git clone git://git.sv.gnu.org/coreutils
. Sólo se cambia una línea de código en ls-dir.c y es la siguiente:int ls_mode = LS_MULTI_COL;
. Técnicamente no es un alias, pero prácticamente es LS pero con diferentes opciones predeterminadas (1 línea de código).dir
esls
pero con diferentes opciones por defecto .dir
yls
siempre han sido binarios separados en distribuciones que usan GNU Coreutils. Algunas distribuciones pueden, o pueden haber, también definido un alias llamadodir
(es bastante común definir alias que tengan el mismo nombre que un comando existente). Pero son ejecutables separados. Distinguir entre un alias de shell (que no es un archivo en absoluto) y un ejecutable separado con un código fuente similar, no es una distinción pedante. Es falso y engañoso decir quedir
es un alias dels
Ubuntu.alias
entonces, por supuesto, no es un alias.