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
ls
bash
명령이 아니라 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
.
따라서 이러한 명령은 이후 플래그가 이전 플래그를 덮어쓰도록 하기 위한 것입니다.