답변:
짧은 답변 :
플래그의 다중 사용을 무시하도록 프로그래밍되어 있기 때문입니다.
긴 대답 :
당신은에서 볼 수 있듯이 소스 코드 의 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
플래그 로 완료하려면 더 오래 걸립니다 . 그러나 이번에는 언급 할 가치가 없습니다. =)
그것이 옳은 일이기 때문입니다. 다음과 같은 스크립트를 작성했다고 가정 해보십시오.
ls $LS_OPTIONS -l "$dir"
곳이있을 가능성이 $LS_OPTIONS
이미 포함되어 있습니다 -l
. 이 명령이 오류를 생성하는 것은 직관적이지 않고 성가 시며 스크립트를 피하기 위해 추가 논리가 필요합니다.
-l
가장 좋은 예는 아니지만 개념이 일반적으로 어떻게 적용되는지 알 수 있기를 바랍니다. 더 좋은 예는 컴파일러 $CFLAGS
의 특정 호출에서 명시 적 옵션을 복제 할 수 있는 컴파일러 옵션입니다 .
ls
옵션 세트로 호출하는 별명을 정의한 경우에도 동일한 상황이 발생할 수 있습니다.
-l
당신의 ls
별명 것은 좋은 생각 같아, 같은 문제는 상호 작용에 좋은 수있는 옵션 발생할 가능성이 ls
같은 별칭 -p
또는 --color=auto
.
ls
. ll
에 대한 별칭 일 수 있으며 해당 별칭이 ls -l
있는 시스템에서는을 입력 할 수 있습니다 ll -lart
.
쉘 별명은 같은 명령 ls
으로 반복 옵션을 허용하지 않으면 상당히 성 가실 것 입니다.
당신이 가지고 있다고 가정
alias ls='ls --color=auto'
alias rm='rm -i'
충돌하는 플래그가 허용되지 않으면 ls --color=never
or ls --color=auto
또는 같은 명령을 실행하면 오류가 발생합니다 rm -i
.
따라서 이러한 명령은 이후 플래그가 이전 플래그보다 우선하도록 설계되었습니다.
--inplace
하고 --delay-updates
, 예를 들면.) 일부 도구는 바로 지난 온다 무엇이든 걸릴; rm -if
아마도 좋은 예일 것입니다. 그러나이 LS의 -l 옵션의 충돌은 따라서,하지 ls -l
와 ls -ll
문제가되지 않습니다, 그것은 의미있는 방식으로 실행에 영향을주지 않습니다. 컴퓨터는 마음을 사로 잡는 반복에 능숙합니다.