ls -l
çıkışını nasıl biçimlendiriyor? Böylece sütun içeriği düzgün bir şekilde sıralanıyor mu?
adresinde çevrimiçi gezinmek için ls
kaynak kodu kullanılabilir GNU Savannah . Çoğu durumda, gerekli maksimum genişlik hesaplanır (örneğin, metin için mbswidth
işlevi kullanılarak) ve daha sonra klasik C printf
işlev biçimi belirticileri ve bazı manuel dolgu kullanılır. Örneğin, format_user_or_group()
işlevlerine bakın ve gobble_file()
.
TP; DR: "sihir" yok, sadece çok fazla hesap var.
Kendi çıktılarınız için bu tür düzgün tablolar istiyorsanız, column
kullanın:
$ 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
Muru’nun yanıtına ek olarak, burada kaynak kodu . :
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 belirteci ‘*’
Bu durumda, ls -l
yürütüldüğünde, bir alan genişliğinin ne kadar büyük olacağı tahmin edilemez, yani, dizin adları uzunluk olarak değişebilir. Bu, alan genişliğinin kendisinin programın bir değer hesaplaması için değişken olması gerektiğini belirtir.
C, alan genişliğinin belirtecini, ek bir parametre olarak alan genişliğini içeren değişkeni bulacağını belirtmek için alan genişliği belirtecinin bulunduğu konumda yıldız işareti kullanır.
Örneğin, genişliğin geçerli değerinin 5 olduğunu varsayalım. Deyim:
printf ("%*d%*d\n", width, 10, width, 11);
yazdıracak: (boşluk bırak)
10 11
Etiketlerdeki diğer soruları oku ls