내 Cygwin 설치가 이상하게 작동합니다. chmod
작동하지 않습니다.
[09:45 Administrator@DellIns14 ~] > ls -ls /usr/bin/chmod
64K -rwxr-xr-x 1 Administrator None 38K Feb 6 2012 /usr/bin/chmod
[09:47 Administrator@DellIns14 ~] > rm /tmp/example.sh
rm: remove regular empty file `/tmp/example.sh'? y
[09:48 Administrator@DellIns14 ~] > touch /tmp/example.sh
[09:48 Administrator@DellIns14 ~] > ls -ls /tmp/example.sh
0 -rw-r--r-- 1 Administrator None 0 Jul 8 09:48 /tmp/example.sh
[09:48 Administrator@DellIns14 ~] > chmod -v +x /tmp/example.sh
mode of `/tmp/example.sh' changed from 0644 (rw-r--r--) to 0755 (rwxr-xr-x)
[09:48 Administrator@DellIns14 ~] > ls -ls /tmp/example.sh
0 -rw-r--r-- 1 Administrator None 0 Jul 8 09:48 /tmp/example.sh
[09:48 Administrator@DellIns14 ~] >
파일이 생성되면 디렉터리에 쓰기가 가능해집니다.
내가 이 디렉토리를 볼 때창문들관점에서 다음과 같이 보고된다.읽기 전용(읽기-쓰기로 변경한 후에도 읽기 전용으로 되돌아갑니다.)
화면 캡처는 다음 위치에 있습니다.cygwin의 /tmp는 Windows에서 읽기 전용이며 읽기-쓰기로 변경할 수 없습니다.
디버깅/해결 방법을 제안해 주실 수 있나요?
환경:
Windows 7, Cygwin 1.7.29(0.272/5/3) i686
답변1
이 답변에 찬사를 보냅니다https://stackoverflow.com/questions/25730041/updating-file-permissions-with-git-bash-on-windows-7아래에 붙여넣은 내용
Windows에서 NTFS 또는 FAT32를 사용하고 있을 수 있으며 해당 파일 시스템은 다음을 지원하지 않습니다.실행 가능허가. 대신에,cygwin은 파일 이름과 내용을 보고 실행 가능한지 여부를 결정합니다.:
파일 이름이 .bat, .com 또는 .exe로 끝나거나 해당 내용이 #!로 시작하는 경우 파일은 실행 가능한 것으로 간주됩니다.
따라서 bash 파일이 shebang으로 시작하는지 확인해야 합니다. 그런 다음 의 권한 출력을 무시하고 파일을 실행할 수 있어야 합니다 ls
.
답변2
나는 찾았다이 답변도움이 되는.
소유자, 그룹, 기타 액세스를 제어하는 일반적인 POSIX 권한 외에도 Cygwin의 파일 권한도 Windows ACL의 영향을 받을 수 있습니다.
귀하의 경우에는 시도해 보십시오
ls -l /tmp/example.sh
getfacl /tmp/example.sh
setfacl -b /tmp/example.sh
ls -l /tmp/example.sh
chmod -v +x /tmp/example.sh
ls -l /tmp/example.sh
답변3
/etc/fstab에 다음이 포함되어 있다는 것을 발견할 때까지 chmod를 수행할 수 없었습니다.
none /cygdrive cygdrive binary,noacl,posix=0,user 0 0
하지만 다음과 같아야 했습니다.
none /cygdrive cygdrive binary,posix=0,user 0 0
열려 있는 모든 Cygwin 프로세스를 닫고 다시 시작한 후 모두 작동했습니다.
답변4
경로가 Windows 형식인 경우 Chmod가 내 컴퓨터에서 자동으로 작동하지 않습니다. "cygdrive" 경로를 사용하면 작동합니다. 예는 다음과 같습니다.
D:\>mkdir D:\test
D:\>touch D:\test\qwe
D:\>ls -l D:\test\qwe
-rw-r--r-- 1 cat None 0 Sep 16 10:40 'D:\test\qwe'
D:\>cacls D:\test\qwe
D:\test\qwe Все:(ID)F
D:\>chmod 600 D:\test\qwe
D:\>ls -l D:\test\qwe
-rw-r--r-- 1 cat None 0 Sep 16 10:40 'D:\test\qwe'
D:\>cacls D:\test\qwe
D:\test\qwe Все:(ID)F
D:\>chmod 600 /cygdrive/D/test/qwe
D:\>ls -l D:\test\qwe
-rw-r--r-- 1 cat None 0 Sep 16 10:40 'D:\test\qwe'
D:\>cacls D:\test\qwe
D:\test\qwe CAT\cat:(специальный доступ:)
STANDARD_RIGHTS_ALL
DELETE
READ_CONTROL
WRITE_DAC
WRITE_OWNER
SYNCHRONIZE
STANDARD_RIGHTS_REQUIRED
FILE_GENERIC_READ
FILE_GENERIC_WRITE
FILE_READ_DATA
FILE_WRITE_DATA
FILE_APPEND_DATA
FILE_READ_EA
FILE_WRITE_EA
FILE_READ_ATTRIBUTES
FILE_WRITE_ATTRIBUTES
CAT\None:(специальный доступ:)
READ_CONTROL
SYNCHRONIZE
FILE_READ_ATTRIBUTES
Все:(специальный доступ:)
READ_CONTROL
SYNCHRONIZE
FILE_READ_ATTRIBUTES
ls -l
또한 행동 에도 이상한 점이 있습니다 . 기본 Windows는 cacls
두 번째가 성공했음을 확인 chmod 600
하지만 그 이후에도 ls -l
말합니다 .-rw-r--r--
그래서 Windows 경로를 cygdrive 경로로 변환하기 위해 cmd "function"을 사용했습니다.
call :chmod "D:\test\qwe"
rem ...
goto :eof
:chmod
set "STMP=%~dp1"
set "STMP=%STMP:\=/%"
set "STMP=%STMP::=%"
set "STMP=/cygdrive/%STMP%%~nx1"
chmod 600 "%STMP%"
set "STMP="
goto :eof
내 구성: Windows 7, 2020년 9월에 업데이트된 cygwin x64, NTFS.