프롬프트 없이 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 -latR
ls -Rtal
따라서 와 같이 충돌하는 명령 옵션이 있는 경우에만 중요하다고 생각합니다 rm -if
. 이것이 맞습니까?
답변1
및 options 와 함께 사용하면 rm
첫 번째 옵션은 무시됩니다. 이 내용은 다음과 같이 기록됩니다.-i
-f
POSIX기준:
-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()가 반복적으로 호출되면 각 옵션 요소의 각 옵션 문자를 연속적으로 반환합니다.
이 함수는 일반적으로 모든 옵션이 처리될 때까지 루프에서 호출됩니다. 이 기능의 관점에서 옵션은 순차적으로 처리됩니다. 그러나 실제로 발생하는 상황은 애플리케이션에 따라 다릅니다. 애플리케이션 논리는 충돌하는 옵션을 감지하거나 이를 재정의하거나 오류를 표시하도록 선택할 수 있기 때문입니다.rm
i
및 옵션 의 경우 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
, 그 자체는 일반적으로 --help
options 보다 더 장황합니다.
답변3
플래그에는 "우선순위"가 없으며 각 프로그램은 원하는 방식으로 플래그를 처리합니다. 대부분의 사람들은 모든 플래그를 수집하고 충돌을 확인하기 위해 약간의 노력을 기울일 것이며, referenced와 같은 표준 도구의 rm(1)
경우 관련 표준이 무언가를 시행할 수 있습니다. 특별히 테스트되지 않았습니다).
프로그래머가 프로그램을 작성하는 가장 쉬운 방법은 매개변수(플래그 및 기타)를 엄격하게 왼쪽에서 오른쪽 순서로 고려하고 장애물에 부딪혔을 때 이를 무시하는 것입니다. 플래그를 처리하기 위해 라이브러리를 사용하는 경우(예: getopt(3)
여러 버전 보유) 프로그래머는 아마도 가장 간단하고 자연스러운 작업을 수행할 것입니다. 프로그래머도 인간이고 인간은 게으릅니다(또는 적어도 조합 폭발에 대해 생각하는 것을 좋아하지 않습니다).