ls
devuelve resultados en varias columnas, mientras que ls|cat
devuelve resultados idénticos en bytes con los ls -1
directorios que he probado. Todavía veo ls -1
respuestas entubados, como ls -1|wc -l
. ¿Hay alguna razón para preferir ls -1
? ¿Por qué ...|cat
cambia la salida de ls
?
19
n=0; for i in .* *; do ((n++)) ; done ; echo $n
(suelte el. * si no desea contarlas). o:ls -1d ./.* ./* | grep '^\./' | wc -l
(como los nombres de archivo no pueden contener '/')ls
La salida a un terminal comúnmente incluye códigos de color por defecto. Para la salida a un no terminal, el color generalmente está deshabilitado de forma predeterminada. En GNU, eso es--color={always,auto,never}
IIRC. Si el color se incluye en uno pero no en otro, entonces las salidas pueden aparecer idénticas en la pantalla, pero no son idénticas en bytes (los códigos de color forman parte de la salida de ls).Respuestas:
ls
prueba si la salida va a una terminal. Si la salida no va a una terminal, entonces-1
es la predeterminada. (Esto se puede anular por uno de los-C
,-m
o-x
las opciones).Por lo tanto, cuando
ls
se usa en una tubería y no lo ha anulado con otra opción,ls
lo usará-1
. Puede confiar en esto porque POSIX requiere este comportamientoEspecificación POSIX
POSIX requiere
-1
como valor predeterminado cada vez que la salida no va a una terminal:La especificación POSIX :
Estas tres opciones que anulan el formato predeterminado de una sola columna son:
Documentación de GNU
Del manual de GNU ls :
Ejemplos
Vamos a crear tres archivos:
Cuando la salida va a una terminal, GNU
ls
elige usar un formato de múltiples columnas:Cuando la salida se dirige a una tubería, la especificación POSIX requiere que la columna única sea la predeterminada:
Las tres excepciones que anulan el comportamiento predeterminado de una sola columna son
-m
las separadas por comas, las-C
columnas ordenadas y las-x
columnas ordenadas:fuente
-1
como valor predeterminado, excepto cuando la salida va al terminal (u otras condiciones)¿Por qué la tubería de la salida estándar cambia el comportamiento de
ls
? Porque fue diseñado de esa manera. La especificación POSIX dice:que en realidad es ambiguo sobre el comportamiento predeterminado (cuando no está especificado por una opción como
-l
o-1
) con salida a una terminal, y la documentación de GNU Coreutils diceEntonces puede ver que la salida a un archivo actuará igual que la salida a una tubería; es decir, una entrada por línea, como si se
-1
hubiera especificado.ls
está escribiendo en una terminal, espera que un ser humano esté mirando la salida. La gente preferirá obtener información en el número mínimo necesario de líneas, por lo que las cosas no se desplazan de la pantalla.ls
escribe en una tubería, espera que otro programa esté leyendo la salida. Es mucho más fácil para un programa leer datos que son un valor por línea que tratar de analizar columnas (ya que los nombres de archivo pueden contener espacios).ls -1
cuando estás escribiendo en un archivo o una tubería? No.fuente
Al canalizar ls, ls no puede determinar cuántas columnas tiene realmente la consola (independientemente del comando del lado derecho). Entonces, lo hace por su propia elección o, en otras palabras, este comportamiento es inestable y puede cambiar en futuras versiones.
Por el contrario,
ls -1
se creó con el propósito de contar o crear scripts en general, por lo que su comportamiento es estable.fuente