답변
의 소스 코드는 GNU Savannah에서ls
온라인으로 찾아 볼 수 있습니다 . 대부분의 경우 필요한 최대 너비가 계산 된 후 (예 : 텍스트 기능 사용 ) 클래식 C 함수 형식 지정자와 일부 수동 패딩이 사용됩니다. 예를 들어, 함수를 참조 하고 .mbswidth
printf
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
답변
@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;
}
사용합니다 printf ("%*lu ", width, id);
. 참고 : 가변 필드 너비 지정자 ‘*’
이 경우, ls -l
실행될 때 필요한 필드 너비가 얼마나 큰지 예측할 수 없습니다 . 즉, 디렉토리 이름의 길이가 다를 수 있습니다. 이것은 자체 폭 필드가 있어야한다는 것을 의미 변수 되는, 프로그램이 값을 계산한다 .
C는 필드 너비 지정자 위치에 별표 를 사용하여 추가 매개 변수로 필드 너비 값을 포함하는 변수를 찾을 것임을 printf에 표시합니다.
예를 들어, width의 현재 값이 5라고 가정하십시오.
printf ("%*d%*d\n", width, 10, width, 11);
인쇄합니다 : (간격을 유의하십시오)
10 11