명령의 다양한 옵션을 결합할 때 올바른 순서

명령의 다양한 옵션을 결합할 때 올바른 순서

명령에 여러 옵션이 필요할 때마다 일반적으로 옵션을 그룹화합니다. 예를 들어, tari를 사용하여 아카이브를 생성 하려는 경우에는 tar -cvf archive.tar file1 file2옵션을 함께 넣어야 하는 올바른 순서를 어떻게 알 수 있을지 의심스럽습니다. 사용하면 tar -cfv archive.tar file1 file2오류가 표시됩니다. 다른 많은 명령에서도 이 문제가 발생했습니다. 나는 이것이 매우 어리석은 의심이라는 것을 알고 있지만 그것을 극복하는 데 정말 힘든 시간을 보내고 있습니다. man명령에 대한 설명 도 확인했지만 요약 섹션에서 특정 순서를 지정합니다. 특정 순서로 옵션을 결합하는 것과 관련된 내용을 찾을 수 없습니다.

답변1

특정 명령에 대한 매뉴얼에는 해당 옵션을 사용하는 방법이 정확하게 설명되어 있습니다.

이 경우 -f옵션은 파일 이름 인수를 사용합니다. 옵션에 대한 인수(필요한 경우)~ 해야 하다그냥 그 뒤에 넣으세요. 첫 번째 tar명령에서는 이 파일 이름 매개변수가 이지만 archive.tar두 번째 명령에서는 입니다 v.

두 번째 명령은 , 및 이라는 v세 개의 파일로 구성된 아카이브를 생성하려고 시도합니다 . 존재하지 않을 가능성이 높으므로 이에 대한 오류 메시지가 표시됩니다.archive.tar file1file2archive.tar

다시 한 번 tar매뉴얼에 이에 대해 설명되어 있습니다. GNU tar매뉴얼에는 다음과 같은 내용이 있습니다.

tar -c [-f ARCHIVE] [OPTIONS] [FILE...]

따라서 분명히 -f아카이브의 이름을 사용합니다. 조금 더 내려가면 이렇게 적혀 있어요

-f,--file=ARCHIVE

아카이브 파일이나 장치를 사용하십시오 ARCHIVE. [...]

다른 옵션을 사용 -c하고 -v인수는 사용하지 않습니다.

또한 일반적으로 옵션은 파일 피연산자보다 우선합니다. 일부 GNU 도구를 사용하면 명령줄 끝에 옵션을 추가할 수 있습니다. 예를 들어

tar -c -f archive.tar file1 file2 -v

-v그러나 이것은 (IMHO) 나쁜 스타일이며 다른 많은 Unices( 파일 이름으로 해석됨) 에서 충돌이 발생합니다 .

tar개요에서와 같이 명령을 작성하는 100% 올바른 방법은 다음과 같습니다.

tar -c -f archive.tar -v file1 file2

답변2

이 문제는 일반적으로 다음 매개변수가 필요한 옵션과 관련되어 있습니다. 타르를 예로 들어보겠습니다.
-f파일 이름이 필수이므로 뒤에 파일 이름이 와야 합니다.

의사코드에서 인수 구문 분석의 일반적인 형태는 이를 설명하는 데 도움이 될 수 있습니다. 인수는 명령에 벡터로 제공된다는 점을 기억하십시오( -cvf파일은 로 분할됨 argv[0]=c argv[1]=v argv[2]=f argv[3]=file).

While $argv is not empty
do
   case $argv[0] in # argv[0] is pointer to leftmost, or first, arg
       c) # single element argument
          set internal variable create_mode=true
          shift # remove argv[0], shifting all indexes down by 1, so argv[0] now points to former argv[1]
       f) # A double element argument
          set internal variable use_file=true
          shift
          set internal variable file_name=$argv[0] # We did a shift, so now argv[0] points to the argument following 'f'
          shift
       v) # Another single element argument 
          set internal variable verbose=true
          shift
      # and so on, there is a case for each possible argument, and shifts according to the number of elements in each argument
done 

루프는 argv(인수 벡터)가 비어 있을 때까지 argv의 각 인수를 계속 처리합니다.
보시다시피, 매개변수에 여러 부분이 있는 경우 매개변수 처리 구현으로 인해 해당 부분은 모두 매개변수 바로 뒤에 와야 합니다.

관련 정보