cygwinのchmodは動作しているように見えますが、実際には動作しません

cygwinのchmodは動作しているように見えますが、実際には動作しません

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 はcacls2 番目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。

関連情報