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/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
2 番目chmod 600
が成功したことを確認しますが、その後もls -l
表示されます。-rw-r--r--
そこで、Windows パスを cygdrive パスに変換するために、cmd の「関数」を使用しました。
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。