명령 옵션의 우선 순위?


21

나는 알고 rm -f file1강제로 제거됩니다 file1나 메시지를 표시하지 않고.

또한 rm -i file1제거하기 전에 먼저 메시지 가 표시 됩니다.file1

이제를 실행하면 메시지가 표시되지 않고 rm -if file1강제로 제거 file1됩니다.

그러나을 실행하면을 rm -fi file1제거하기 전에 프롬프트가 표시됩니다 file1.

명령 옵션을 결합 할 때 마지막 옵션이 우선한다는 것은 사실입니까? 그런 rm -if다음 -f우선 순위를 가지지 만 rm -fi다음 -i우선 순위를 갖습니다.

ls당신이 말한 예를 들어 명령, 그것은 중요하지 않습니다 ls -latR또는 ls -Rtal.

따라서과 같은 모순 명령 옵션이있을 때만 중요하다고 생각합니다. rm -if맞습니까?


답변:


23

및 옵션 rm과 함께 사용 하면 첫 번째 옵션은 무시됩니다. 이것은 POSIX 표준에 문서화되어 있습니다 :-i-f

    -f
       Do not prompt for confirmation. Do not write diagnostic messages or modify
       the exit status in the case of nonexistent operands. Any previous
       occurrences of the -i option shall be ignored.
    -i
       Prompt for confirmation as described previously. Any previous occurrences
       of the -f option shall be ignored.

그리고 GNU info페이지에서도 :

‘-f’
‘--force’

    Ignore nonexistent files and missing operands, and never prompt the user.
    Ignore any previous --interactive (-i) option.

‘-i’
    Prompt whether to remove each file. If the response is not affirmative, the
    file is skipped. Ignore any previous --force (-f) option.

후드에서 어떤 일이 발생하는지 봅시다 :

rm옵션을 getopt(3)특히으로 처리합니다 getopt_long. 이 함수는 명령 행 ( **argv)에서 옵션 인수 를 순서대로 처리합니다.

getopt ()가 반복적으로 호출되면 각 옵션 요소에서 각 옵션 문자를 연속적으로 리턴합니다.

이 함수는 일반적으로 모든 옵션이 처리 될 때까지 루프에서 호출됩니다. 이 기능 관점에서 옵션은 순서대로 처리됩니다. 그러나 실제로 발생하는 상황은 응용 프로그램 논리가 충돌하는 옵션을 감지하거나 재정의하거나 오류를 표시하도록 선택할 수 있으므로 응용 프로그램에 따라 다릅니다. 의 경우를 들어 rmif옵션, 그들은 완벽하게 덮어 쓰기 서로. 보낸 사람 rm.c:

234         case 'f':
235           x.interactive = RMI_NEVER;
236           x.ignore_missing_files = true;
237           prompt_once = false;
238           break;
239 
240         case 'i':
241           x.interactive = RMI_ALWAYS;
242           x.ignore_missing_files = false;
243           prompt_once = false;
244           break;

두 옵션 모두 동일한 변수를 설정하며 이러한 변수의 상태는 명령 행에서 마지막에있는 옵션입니다. 이것의 영향은 POSIX 표준 및 rm문서 와 일치합니다 .


3
대부분의 명령은 순서대로 인수를 처리하며 충돌시 오류가 발생하거나 마지막 설정 (예 :)을 사용 rm합니다. 명령이 옵션의 첫 번째 설정을 사용하고 이미 설정된 옵션을 변경하는 인수를 무시하는 경우는 거의 없습니다.
Peter Cordes

7

예, rm이것이 유효합니다. 그러나 마지막 옵션이 이전 옵션을 대체하는 경우 개별 프로그램 자체에 따라 다릅니다. ʻinfo rm´에서

'-f' '--force'존재하지 않는 파일과 누락 된 피연산자를 무시하고 사용자에게 프롬프트하지 않습니다. 이전의 모든 '--interactive'( '-i') 옵션은 무시하십시오.

'-i'각 파일을 제거할지 묻습니다. 응답이 긍정적이지 않으면 파일을 건너 뜁니다. 이전의 모든 '--force'( '-f') 옵션은 무시하십시오. '--interactive = always'와 같습니다.

일반적인 힌트 : info일반적으로보다 더 상세합니다 . 일반적으로 옵션 man보다 더 상세합니다 --help.


7

플래그에는 "우선 순위"가 없으며 각 프로그램은 원하는 방식으로 플래그를 처리합니다. 대부분은 모든 플래그를 수집하고 충돌을 확인하기 위해 노력합니다. (표준과 같은) 표준 도구의 rm(1)경우 관련 표준이 무언가를 요구할 수 있습니다 (다시, 표준의 코너 사례를 해석하는 데 특정 버전이 느슨해 지거나 구체적으로 테스트되지 않음) 그들을 위해).

프로그래머가 프로그램을 작성하는 경우 인수 (플래그 및 기타)를 엄격한 왼쪽에서 오른쪽 순서로 고려하는 것이 가장 쉬울 수 있으며, 일부 문제에 부딪 칠 때 구제 될 수도 있습니다. 라이브러리를 사용하여 플래그를 처리하는 경우 (예 getopt(3): 여러 버전이 떠 있음) 프로그래머는 아마도 가장 쉽고 자연스러운 것을 수행 할 것입니다. 프로그래머는 사람들이고, 사람들은 게으르다 (또는 최소한 조합 폭발을 통한 사고를 좋아하지 않는다).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.