19
Der Quellcode von kann ls
online in GNU Savannah durchsucht werden . In den meisten Fällen wird die erforderliche maximale Breite berechnet (z. B. mithilfe der mbswidth
Funktion für Text). Anschließend werden die klassischen printf
Formatbezeichner für C- Funktionen und einige manuelle Auffüllungen verwendet. Siehe z. B. die Funktionen format_user_or_group()
und gobble_file()
.
TL; DR: Es gibt keine "Magie", nur viel Grunzen.
Wenn Sie solche übersichtlichen Tabellen für Ihre eigene Ausgabe benötigen, verwenden Sie 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
findmnt --fstab
. Das Paket util-linux enthält sogar eine Bibliothek "libsmartcols" (früher libtt), die in findmnt, lsblk usw. zum Drucken einer ausgerichteten Tabelle verwendet wird.findmnt
, aber ich habe nie bemerkt, dass es das auch kann./bin/ls
ist ein Teil des Pakets (GNU)coreutils
. Sie können dies finden, indem Sie ausführendpkg-query -S /bin/ls
. Sobald Sie den Paketnamen kennen, können Sie jeden Ubuntu-Paket-genauen Quellcode herunterladen, aus dem die Binärdatei besteht (dies ist wichtig), indem Sieapt-get source <package_name>
Zusätzlich zu @murus Antwort ist hier der Teil des Quellcodes, der die
width
richtige Rechtfertigung der Ausgabe berechnet . :Es verwendet,
printf ("%*lu ", width, id);
. HINWEIS: Variabler Feldbreitenbezeichner '*'In diesem Fall kann nicht vorhergesagt werden, wie groß die Feldbreite sein wird, die bei der
ls -l
Ausführung benötigt wird, dh die Namen der Verzeichnisse können unterschiedlich lang sein. Dies impliziert, dass die Feldbreite selbst eine Variable sein muss , für die das Programm einen Wert berechnet .C verwendet ein Sternchen an der Position des Feldbreitenspezifizierers, um zu drucken, dass es die Variable findet, die den Wert der Feldbreite als zusätzlichen Parameter enthält.
Angenommen, der aktuelle Wert für width ist 5. Die Anweisung:
wird gedruckt: (Abstand beachten)
quelle
width
hier istscontext_width
, berechnet vongooble_file
, die andere Funktion, die ich erwähnt habe.