명령 옵션의 우선순위?

명령 옵션의 우선순위?

프롬프트 없이 rm -f file1강제로 삭제 된다는 것을 알고 있습니다.file1

rm -i file1또한 삭제하기 전에 메시지가 표시된다는 것도 알고 있습니다.file1

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

그러나 을 실행하면 rm -fi file1삭제하기 전에 메시지가 표시됩니다 file1.

그러면 명령 옵션을 결합할 때 마지막 옵션이 우선 적용됩니까? like 가 우선권을 가지지만 rm 은 rm -if우선권 을 갖습니다.-f-fi-i

예를 들어 명령을 말하면 또는 이라고 해도 상관 없습니다 ls.ls -latRls -Rtal

따라서 와 같이 충돌하는 명령 옵션이 있는 경우에만 중요하다고 생각합니다 rm -if. 이것이 맞습니까?

답변1

및 options 와 함께 사용하면 rm첫 번째 옵션은 무시됩니다. 이 내용은 다음과 같이 기록됩니다.-i-fPOSIX기준:

    -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.

뒤에서 무슨 일이 일어나는지 봅시다:

rmgetopt(3)옵션을 전문으로 합니다 getopt_long. 이 함수는 **argv명령줄( )의 옵션 매개변수를 나타나는 순서대로 처리합니다.

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

이 함수는 일반적으로 모든 옵션이 처리될 때까지 루프에서 호출됩니다. 이 기능의 관점에서 옵션은 순차적으로 처리됩니다. 그러나 실제로 발생하는 상황은 애플리케이션에 따라 다릅니다. 애플리케이션 논리는 충돌하는 옵션을 감지하거나 이를 재정의하거나 오류를 표시하도록 선택할 수 있기 때문입니다.rmi및 옵션 의 경우 f서로를 완벽하게 덮습니다. 에서 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문서를 준수합니다.

답변2

예, rm이것이 효과가 있기 때문입니다. 그러나 마지막 옵션이 이전 옵션보다 우선하는지 여부는 개별 프로그램 자체에 따라 다릅니다. "정보실"에서

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

'-i'는 각 파일을 삭제할지 묻는 메시지를 표시합니다. 응답이 긍정적이지 않으면 파일을 건너뜁니다. 이전의 모든 "--force"("-f") 옵션은 무시됩니다. "--interactive=always"와 동일합니다.

일반적인 팁: info일반적으로 보다 더 장황하며 man, 그 자체는 일반적으로 --helpoptions 보다 더 장황합니다.

답변3

플래그에는 "우선순위"가 없으며 각 프로그램은 원하는 방식으로 플래그를 처리합니다. 대부분의 사람들은 모든 플래그를 수집하고 충돌을 확인하기 위해 약간의 노력을 기울일 것이며, referenced와 같은 표준 도구의 rm(1)경우 관련 표준이 무언가를 시행할 수 있습니다. 특별히 테스트되지 않았습니다).

프로그래머가 프로그램을 작성하는 가장 쉬운 방법은 매개변수(플래그 및 기타)를 엄격하게 왼쪽에서 오른쪽 순서로 고려하고 장애물에 부딪혔을 때 이를 무시하는 것입니다. 플래그를 처리하기 위해 라이브러리를 사용하는 경우(예: getopt(3)여러 버전 보유) 프로그래머는 아마도 가장 간단하고 자연스러운 작업을 수행할 것입니다. 프로그래머도 인간이고 인간은 게으릅니다(또는 적어도 조합 폭발에 대해 생각하는 것을 좋아하지 않습니다).

관련 정보