Ls -l çıktısını nasıl bu kadar düzgün biçimlendirir?


19

Çıktısını, ls -lsütun içerikleri düzgün bir şekilde hizalanacak şekilde nasıl biçimlendirir?

terminal

Yanıtlar:


34

Kaynak kodu GNU Savannah'dals çevrimiçi tarama için kullanılabilir . Çoğu durumda, gerekli maksimum genişlik hesaplanır (örneğin, metin işlevini kullanarak ) ve ardından klasik C işlev biçimi belirleyicilerini ve bazı manuel dolguları kullanır. Örneğin, işlevleri bakın ve .mbswidthprintfformat_user_or_group()gobble_file()

TP; DR: "Sihir" yok, sadece bir sürü homurdanma hesabı var.


Kendi çıktınız için bu tür düzgün tablolar istiyorsanız, şunu kullanın 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

4
Örnek olarak / etc / fstab kullandığınız göz önüne alındığında, yardım edemem ama öneride bulunamıyorum findmnt --fstab. Util-linux paketi bile bir kitaplık "libsmartcols" bir hizalanmış tablo yazdırmak için findmnt, lsblk vs. kullandığı (daha önce libtt) ile birlikte gelir.
Grawity

@grawity güzel. Daha findmntönce kullanmıştım , ama bunu da yapabileceğini hiç fark etmemiştim.
muru

Ayrıca bilmek iyi: Ubuntu / debian'da /bin/lspaketin (GNU) bir parçasıdır coreutils. Bunu çalıştırarak bulabilirsiniz dpkg-query -S /bin/ls. Paket adını öğrendikten sonra , ikili kodun oluşturulduğu herhangi bir Ubuntu paketinin tam kaynak kodunu indirebilirsiniz (bu önemlidir)apt-get source <package_name>
arielf

17

@Muru'nun cevabına ek olarak , kaynak kodununwidth çıktının doğru gerekçelendirilmesi için hesaplanan kısmı da burada . :

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;
}

Kullanır printf ("%*lu ", width, id);,. NOT: değişken alan genişliği belirticisi '*'

Bu durumda, ls -lyürütüldüğünde alan genişliğine ne kadar ihtiyacımız olacağı tahmin edilemez , yani Dizinlerin adları uzunluk olarak değişebilir. Bu, alan genişliğinin kendisinin , programın bir değer hesaplayacağı bir değişken olması gerektiği anlamına gelir .

C , alan genişliği belirteci konumunda yıldız işareti kullanarak, ek bir parametre olarak alan genişliği değerini içeren değişkeni bulacağını belirtir.

Örneğin, geçerli genişlik değerinin 5 olduğunu varsayalım.

printf ("%*d%*d\n", width, 10, width, 11);

yazdıracak: (boşluğu not edin)

   10   11

widthBurada olan scontext_width, hesaplanan gooble_file, diğer bahsettiğim işlevi.
muru
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.