ls가 중복 스위치를 허용하는 이유는 무엇입니까?

ls가 중복 스위치를 허용하는 이유는 무엇입니까?

ls -l궁금합니다. 와 의 차이점이 있나요 ls -lllllllllllllllllllllllllllll?

출력은 동일한 것 같은데 ls왜 중복 스위치가 허용되는지 혼란스럽습니다. 이것이 대부분의 명령에서 표준 관행입니까?

답변1

왜냐하면 그것이 옳은 일이기 때문입니다. 다음을 수행하는 스크립트가 있다고 가정해 보겠습니다.

ls $LS_OPTIONS -l "$dir"

$LS_OPTIONS이 명령이 오류를 생성한다는 것은 직관 에 어긋나고 짜증나는 일 -l이며, 이를 방지하려면 스크립트에 추가 논리를 추가해야 합니다.

-l가장 좋은 예는 아닐 수도 있지만 이 개념이 일반적으로 어떻게 적용되는지에 대한 아이디어를 얻을 수 있기를 바랍니다. 더 좋은 예는 컴파일러 옵션입니다. 왜냐하면 $CFLAGS특정 컴파일러 호출에서 명시적 옵션을 반복하는 것이 가능할 수 있기 때문입니다.

답변2

짧은 답변:

플래그의 여러 사용을 무시하도록 프로그래밍되어 있기 때문입니다.

긴 답변:

당신처럼소스 코드그중에는 기능 과 거대한 스위치 상자가 ls있는 섹션이 있습니다 .getopt_long()

1648       int c = getopt_long (argc, argv,
1649                            "abcdfghiklmnopqrstuvw:xABCDFGHI:LNQRST:UXZ1",
1650                            long_options, &oi);
      ....
1654       switch (c)
1655         {
      ....
1707         case 'l':
1708           format = long_format;
1709           break;
      ....
1964     }

이 함수는 getopt_long()프로그램에 제공된 모든 인수를 읽습니다. 변수가 설정된 경우 -l. format따라서 여러 번 입력하면 -lllllllll변수가 여러 번 설정되지만 이로 인해 아무 것도 변경되지 않습니다.

글쎄, 한 가지가 바뀌 었습니다. 여러 플래그로 인해 이 거대한 스위치 케이스 문은 여러 번 실행되어야 합니다 -l. ls여러 표지판을 완료하는 데 시간이 더 걸립니다 -l. 하지만 이번에는 언급할 가치가 없습니다. =)

답변3

lsbash명령이 아니라 bash. 즉, 존재하는 경우 출력이 긴 스타일 형식으로 출력되도록 -l하는 부울 플래그일 뿐입니다 . ls대부분의 프로그램은 이러한 플래그( ls -ll와 동일 ls -l -l)의 여러 사용을 단순히 무시하지만 몇 가지 예외가 있습니다(예: -v"자세한"을 의미하는 경우 프로그램은 여러 사용을 "더 자세한"으로 해석할 수 있습니다).

답변4

ls이와 같은 명령이 반복되는 옵션을 허용하지 않으면 쉘 별칭은 매우 성가실 수 있습니다.

당신이 가지고 있다고 가정

alias ls='ls --color=auto'
alias rm='rm -i'

그러면 충돌하는 플래그가 허용되지 않는 경우 ls --color=never또는 와 같은 ls --color=auto명령을 실행하는 것은 오류가 됩니다 rm -i.

따라서 이러한 명령은 이후 플래그가 이전 플래그를 덮어쓰도록 하기 위한 것입니다.

관련 정보