In che modo ls -l
formatta l'output in modo che i contenuti delle colonne siano allineati correttamente?
Il codice sorgente di ls
è disponibile per la navigazione online su GNU Savannah . Nella maggior parte dei casi, viene calcolata la larghezza massima richiesta (ad esempio, utilizzando la funzione mbswidth
per il testo), quindi utilizza i classici specificatori di formato di funzione C printf
e un riempimento manuale. Vedi, ad esempio, le funzioni format_user_or_group()
, e gobble_file()
.
TL; DR: non c'è "magia", solo un sacco di calcoli grugniti.
Se desideri tabelle così nitide per il tuo output, utilizza column
:
$ grep -vE '^#' /etc/fstab
UUID=cdff3742-9d03-4bc1-93e3-ae50708474f2 / ext4 errors=remount-ro 0 1
/dev/mapper/lvmg-homelvm /home btrfs defaults,compress=lzo,space_cache,relatime 0 2
UUID="bb76cd0d-ae1d-4490-85da-1560c32679cd" none swap sw 0 0
UUID="a264b1b1-cf82-40aa-ab9e-a810cfba169a" /home/muru/arch btrfs defaults,compress=lzo,space_cache,relatime 0 2
$ grep -vE '^#' /etc/fstab | column -t
UUID=cdff3742-9d03-4bc1-93e3-ae50708474f2 / ext4 errors=remount-ro 0 1
/dev/mapper/lvmg-homelvm /home btrfs defaults,compress=lzo,space_cache,relatime 0 2
UUID="bb76cd0d-ae1d-4490-85da-1560c32679cd" none swap sw 0 0
UUID="a264b1b1-cf82-40aa-ab9e-a810cfba169a" /home/muru/arch btrfs defaults,compress=lzo,space_cache,relatime 0 2
Oltre alla risposta di @muru , ecco la parte di codice sorgente che calcola width
per giustificare correttamente l'output. :
static void
format_user_or_group (char const *name, unsigned long int id, int width)
{
size_t len;
if (name)
{
int width_gap = width - mbswidth (name, 0);
int pad = MAX (0, width_gap);
fputs (name, stdout);
len = strlen (name) + pad;
do
putchar (' ');
while (pad--);
}
else
{
printf ("%*lu ", width, id);
len = width;
}
dired_pos += len + 1;
}
Utilizza printf ("%*lu ", width, id);
. NOTA: specificatore della larghezza del campo variabile '*'
In questo caso, non è possibile prevedere la larghezza di campo necessaria quando viene eseguito ls -l
, vale a dire che i nomi delle directory possono variare in lunghezza. Ciò implica che la larghezza del campo stessa deve essere una variabile , per la quale il programma calcolerà un valore .
C utilizza un asterisco nella posizione dell'amplificatore della larghezza del campo per indicare a printf che troverà la variabile che contiene il valore della larghezza del campo come parametro aggiuntivo.
Ad esempio, supponiamo che il valore corrente della larghezza sia 5. La dichiarazione:
printf ("%*d%*d\n", width, 10, width, 11);
stamperà: (notare la spaziatura)
10 11
Leggi altre domande sui tag ls