mur*_*uru 34
的源代码ls
可在GNU Savannah上在线浏览。在大多数情况下,计算所需的最大宽度(例如,使用mbswidth
文本函数),然后使用经典的 Cprintf
函数格式说明符和一些手动填充。例如,请参见函数format_user_or_group()
、 和gobble_file()
。
TL; DR:没有“魔法”,只有大量繁重的计算。
如果您想要这样整洁的表格用于您自己的输出,请使用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
Run Code Online (Sandbox Code Playgroud)
Sev*_*Tux 17
除了@muru 的回答之外,这里是源代码的一部分,用于计算 width
输出的正确对齐。:
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;
}
Run Code Online (Sandbox Code Playgroud)
它使用,printf ("%*lu ", width, id);
。注意: 可变字段宽度说明符“*”
在这种情况下,无法预测我们在ls -l
执行时需要多大的字段宽度,即目录名称的长度可能会有所不同。这意味着字段宽度本身需要是一个变量,程序将为它计算一个值。
C在字段宽度说明符的位置使用星号向 printf 指示它将找到包含字段宽度值作为附加参数的变量。
例如,假设当前的宽度值为 5。语句:
printf ("%*d%*d\n", width, 10, width, 11);
Run Code Online (Sandbox Code Playgroud)
将打印:(注意间距)
10 11
Run Code Online (Sandbox Code Playgroud)