Yanıtlar:
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 .mbswidth
printf
format_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
findmnt
önce kullanmıştım , ama bunu da yapabileceğini hiç fark etmemiştim.
/bin/ls
paketin (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>
@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 -l
yü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
width
Burada olan scontext_width
, hesaplanan gooble_file
, diğer bahsettiğim işlevi.
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.