chmod 명령을 잘못된 순서로 호출하려고했습니다. chmod file.txt -r이것은 어떤 이유로 작동했습니다. chmod file.txt +r반면에 일을 거부했다. 왜 이런거야? 어떤 이유로 어떤 명령이 작동하고 다른 명령이 작동하지 않습니까?
chmod 명령을 잘못된 순서로 호출하려고했습니다. chmod file.txt -r이것은 어떤 이유로 작동했습니다. chmod file.txt +r반면에 일을 거부했다. 왜 이런거야? 어떤 이유로 어떤 명령이 작동하고 다른 명령이 작동하지 않습니까?
답변:
이것은 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 --all은 all옵션입니다. rm -rf(와 동일 rm -r -f)에는 옵션 r과 f옵션 이 모두 있습니다.
다른 모든 것은 기술적으로 피연산자 라고하는 옵션이 아닌 인수 입니다. 나는 그들의 의미가 그들의 상대적인 위치에 의해 결정되기 때문에 이러한 위치 주장 을 부르고 싶다 . 에서는 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)는 모드로 해석되며 구문 분석에 실패합니다.
a+rwx이와 같은 작업을 수행chmod * +r하고a+rwx파일이 glob 확장에서 가장 먼저 발생하는 경우 흥미로운 결과가 발생할 수 있습니다 .