Chmod와 -r + r


13

chmod 명령을 잘못된 순서로 호출하려고했습니다. chmod file.txt -r이것은 어떤 이유로 작동했습니다. chmod file.txt +r반면에 일을 거부했다. 왜 이런거야? 어떤 이유로 어떤 명령이 작동하고 다른 명령이 작동하지 않습니까?

답변:


18

이것은 GNU chmod가 입력을 처리하는 방법에 대한 문제이며 모든 POSIX 호환 chmod 구현에 이식 가능하지는 않습니다.

참고 것을 POSIX가chmod coomand 줄 구문은 필요 않는 한, 최초의 올 모드를 GNU가chmod (옵션도 모드 앞에 와야한다). 다른 것은 문서화되지 않은 구현 문제입니다.


이제이 특정 구현에서 왜 발생하는지에 대해

매뉴얼 에서 힌트를 얻었습니다 .

그러나 일반적으로 ' chmod a-w file'가 바람직하며 ' chmod -w file없이 ' '와 --다른 방식으로 동작 할 경우 불평합니다 chmod a-w file.

간단히 말해서 구문 분석 된 옵션 getopt앞에는 접두사가 붙습니다 -. 에서와 마찬가지로 ls -a, a옵션입니다. 긴 형식 ls --allall옵션입니다. rm -rf(와 동일 rm -r -f)에는 옵션 rf옵션 이 모두 있습니다.

다른 모든 것은 기술적으로 피연산자 라고하는 옵션이 아닌 인수 입니다. 나는 그들의 의미가 그들의 상대적인 위치에 의해 결정되기 때문에 이러한 위치 주장 을 부르고 싶다 . 에서는 chmod상기 제 1 위치 인수 모드이고, 제 위치 인수는 파일 이름이다.

최적의 모드는로 시작하지 않아야합니다 -. 그렇다면 --옵션 대신에 피연산자를 강제로 구문 분석 하는 데 사용해야 합니다 (예 : chmod a-w file또는 chmod -- -w file대신 사용) chmod -w file. POSIX 에서도 제안 합니다.


소스 코드 를 보면 getopt 를 사용 하여 명령 행 옵션을 구문 분석 하는 것을 알 수 있습니다. 여기에 다음과 같은 '잘못된'모드에 대한 특수 처리가 있습니다 -w.

    case 'r':
    case 'w':
    case 'x':
    case 'X':
    case 's':
    case 't':
    case 'u':
    case 'g':
    case 'o':
    case 'a':
    case ',':
    case '+':
    case '=':
    case '0': case '1': case '2': case '3':
    case '4': case '5': case '6': case '7':
      /* Support nonportable uses like "chmod -w", but diagnose
         surprises due to umask confusion.  Even though "--", "--r",
         etc., are valid modes, there is no "case '-'" here since
         getopt_long reserves leading "--" for long options.  */

예를 들면 :

  • chmod a-r file.txt가장 강력한 호출 이 될 것 입니다.
  • chmod +r file.txt 첫 번째 인수가 위치로 모드로 해석되기 때문에 작동합니다.
  • chmod -r file.txt-r는 짧은 r옵션으로 해석 되고 특수한 경우 로 여전히 작동합니다 .
  • chmod -- -r file.txt-r위치 적으로 모드로 해석 되기 때문에 정확하고 작동 합니다. 없는 경우에서이 다릅니다 --과 함께 있기 때문에 --(가) -rint로서 해석되지 않습니다 옵션 .
  • chmod file.txt -r-r는 짧은 r옵션으로 해석 되고 특수한 경우 로 여전히 작동합니다 . 옵션은 위치에 따라 다릅니다. 이것은 기술적으로 문서화되지 않은 단점을 남용합니다.
  • chmod file.txt +r+r옵션이 아닌 피연산자 이므로 작동하지 않습니다 . 첫 번째 피연산자 ( file.txt)는 모드로 해석되며 구문 분석에 실패합니다.

4
예를 들어, 이름이 같은 파일이 있고 a+rwx이와 같은 작업을 수행 chmod * +r하고 a+rwx파일이 glob 확장에서 가장 먼저 발생하는 경우 흥미로운 결과가 발생할 수 있습니다 .
Jörg W Mittag

1
또는 "rm *"의 경우 "-rf"라는 파일.
Edheldil

@ Edheldil 네 맞습니다. 이것은 해결해야 할 것 같습니다 (그리고 입력이 제대로 위생 처리되지 않은 것처럼 버그가 있습니다)
TestyTentacleLinux


@StevenPenny 그것은 관련이 없습니다. 첫째, 링크 맨 즉은, 섹션 1 getopt 명령 이 아닌 라이브러리 루틴섹션 3 . 두 번째로, optstring즉 허용되는 옵션 목록 ( chmod소스 optstring에서이 설정 됨 "Rcfvr::w::x::X::s::t::u::g::o::a::,::+::=::") 을 참조합니다. 연결된 "SCANNING MODES"섹션은 프로그램에 전달 된 인수가 포함 된 인수 배열 과 관련이 없습니다 argv.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.