我的 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
我无法执行 chmod 操作,直到我发现 /etc/fstab 包含:
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
。本机 Windowscacls
确认第二个chmod 600
操作成功,但之后仍然如此ls -l
。-rw-r--r--
因此我使用 cmd“功能”将 windows 路径转换为 cygdrive 路径:
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、cygwin x64(2020 年 9 月更新)、NTFS。