我的 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 ~] >
請注意,在建立檔案時,該目錄是可寫入的。
當我從 a 查看這個目錄時視窗角度來看,據報道只讀(即使我將其更改為讀寫後,它也會恢復為唯讀)。
螢幕截圖位於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
。 Native Windowscacls
確認第二次chmod 600
成功,但即使在那之後也是ls -l
如此-rw-r--r--
。
所以我使用 cmd“function”將 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,2020 年 9 月更新的 cygwin x64,NTFS。