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

ls는 bash명령이 아니라에서 실행되는 별도의 실행 파일입니다 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 -l와 ls -ll문제가되지 않습니다, 그것은 의미있는 방식으로 실행에 영향을주지 않습니다. 컴퓨터는 마음을 사로 잡는 반복에 능숙합니다.
— CVn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.