lsdevuelve resultados en varias columnas, mientras que ls|catdevuelve resultados idénticos en bytes con los ls -1directorios que he probado. Todavía veo ls -1respuestas entubados, como ls -1|wc -l. ¿Hay alguna razón para preferir ls -1? ¿Por qué ...|catcambia 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 '/')lsLa 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:
lsprueba si la salida va a una terminal. Si la salida no va a una terminal, entonces-1es la predeterminada. (Esto se puede anular por uno de los-C,-mo-xlas opciones).Por lo tanto, cuando
lsse usa en una tubería y no lo ha anulado con otra opción,lslo usará-1. Puede confiar en esto porque POSIX requiere este comportamientoEspecificación POSIX
POSIX requiere
-1como 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
lselige 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
-mlas separadas por comas, las-Ccolumnas ordenadas y las-xcolumnas ordenadas:fuente
-1como 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
-lo-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
-1hubiera especificado.lsestá 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.lsescribe 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 -1cuando 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 -1se creó con el propósito de contar o crear scripts en general, por lo que su comportamiento es estable.fuente