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


16

궁금합니다- ls -l와 차이가 ls -lllllllllllllllllllllllllllll있습니까?

출력이 같고 ls중복 스위치를 허용 하는 이유가 혼란 스럽습니다 . 이것이 대부분의 명령에서 표준 관행입니까?

답변:


17

짧은 답변 :

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

긴 대답 :

당신은에서 볼 수 있듯이 소스 코드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플래그 로 완료하려면 더 오래 걸립니다 . 그러나 이번에는 언급 할 가치가 없습니다. =)


11
또는 다른 방법으로 말하면, 거부하는 것이 프로그래머를 무시하는 것보다 더 많은 일이 될 것입니다.
Mark

1
내가 말할 내용을 말하면 +0.5, 소스로 이동하면 +0.5
CVn

21

그것이 옳은 일이기 때문입니다. 다음과 같은 스크립트를 작성했다고 가정 해보십시오.

ls $LS_OPTIONS -l "$dir"

곳이있을 가능성이 $LS_OPTIONS이미 포함되어 있습니다 -l. 이 명령이 오류를 생성하는 것은 직관적이지 않고 성가 시며 스크립트를 피하기 위해 추가 논리가 필요합니다.

-l가장 좋은 예는 아니지만 개념이 일반적으로 어떻게 적용되는지 알 수 있기를 바랍니다. 더 좋은 예는 컴파일러 $CFLAGS의 특정 호출에서 명시 적 옵션을 복제 할 수 있는 컴파일러 옵션입니다 .


4
ls옵션 세트로 호출하는 별명을 정의한 경우에도 동일한 상황이 발생할 수 있습니다.
kasperd

1
@kasperd : 그렇습니다. 퍼팅 비록 -l당신의 ls별명 것은 좋은 생각 같아, 같은 문제는 상호 작용에 좋은 수있는 옵션 발생할 가능성이 ls같은 별칭 -p또는 --color=auto.
R .. GitHub 중지 지원 얼음

1
별칭을 호출 할 필요는 없습니다 ls. ll에 대한 별칭 일 수 있으며 해당 별칭이 ls -l있는 시스템에서는을 입력 할 수 있습니다 ll -lart.
kasperd

11

lsbash명령이 아니라에서 실행되는 별도의 실행 파일입니다 bash. 즉, -l존재하는 경우 ls출력에 긴 스타일 형식을 사용하는 부울 플래그 유형일뿐 입니다. 대부분의 프로그램은 그러한 플래그의 다중 사용 ( ls -ll과 동일 ls -l -l)을 무시 하지만, 일부 예외가 있지만 (예를 들어, -v'verbose'를 의미하는 경우 프로그램은 "더 자세한 정보"를 의미하는 여러 용도를 해석 할 수 있습니다).


2
예는 -vvv입니다 ssh.
Bernhard

또는 심지어aptitude moo
Ruslan

8

쉘 별명은 같은 명령 ls으로 반복 옵션을 허용하지 않으면 상당히 성 가실 것 입니다.

당신이 가지고 있다고 가정

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

충돌하는 플래그가 허용되지 않으면 ls --color=neveror ls --color=auto또는 같은 명령을 실행하면 오류가 발생합니다 rm -i.

따라서 이러한 명령은 이후 플래그가 이전 플래그보다 우선하도록 설계되었습니다.


충돌하는 스위치가 때때로 허용되지 않습니다. (모두 rsync를 시도 --inplace하고 --delay-updates, 예를 들면.) 일부 도구는 바로 지난 온다 무엇이든 걸릴; rm -if아마도 좋은 예일 것입니다. 그러나이 LS의 -l 옵션의 충돌은 따라서,하지 ls -lls -ll문제가되지 않습니다, 그것은 의미있는 방식으로 실행에 영향을주지 않습니다. 컴퓨터는 마음을 사로 잡는 반복에 능숙합니다.
CVn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.