我刚刚在一台新的 Windows 10 机器上安装了 Cygwin。每当我尝试删除文件时,都会收到错误“无效请求代码”。但是到目前为止,我测试过的所有其他文件操作似乎都运行正常。
sbaker@FWA002495 ~ >$ echo "testing" > foo
sbaker@FWA002495 ~ >$ ls -l foo
-rw-r--r-- 1 sbaker LOGFWA+Group(513) 8 Apr 20 12:51 foo
sbaker@FWA002495 ~ >$ cat foo
testing
sbaker@FWA002495 ~ >$ rm -f foo
rm: cannot remove 'foo': Invalid request code
sbaker@FWA002495 ~ >$ mv foo bar
sbaker@FWA002495 ~ >$ rm -f bar
rm: cannot remove 'bar': Invalid request code
sbaker@FWA002495 ~ >$ which rm
/usr/bin/rm
可以从文件资源管理器或 cmd 提示符中毫无问题地删除文件。我通过文件资源管理器或 cmd 创建的文件的行为方式相同(可以在 Cygwin 中正确读取/附加/重命名/移动,但不能删除。它们也具有相同的用户/组)。
问题并不局限于 rm 命令。例如,使用 vim 编辑文件时,无法删除交换文件。
一个可能有趣的侧注是,破坏似乎工作正常:
sbaker@FWA002495 ~/test >$ echo "test1" > foo
sbaker@FWA002495 ~/test >$ echo "test2" > bar
sbaker@FWA002495 ~/test >$ ls -l
total 2
-rw-r--r-- 1 sbaker LOGFWA+Group(513) 6 Apr 20 13:07 bar
-rw-r--r-- 1 sbaker LOGFWA+Group(513) 6 Apr 20 13:07 foo
sbaker@FWA002495 ~/test >$ mv -f foo bar
sbaker@FWA002495 ~/test >$ ls -l
total 1
-rw-r--r-- 1 sbaker LOGFWA+Group(513) 6 Apr 20 13:07 bar
sbaker@FWA002495 ~/test >$ cat bar
test1
所以文件能被移除,只是以非正常方式。我不确定那意味着什么。
2020 年 4 月 22 日更新:
我编写了一个简单的 C 应用程序来测试删除文件:
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
int main()
{
int r = unlink("testing");
printf("RESULT: %d (%d)\n", r, errno );
perror("err");
return r;
}
当我在 Cygwin 下使用 cc 构建它并运行它时,我得到:
$ ./test1
RESULT: -1 (54)
err: Invalid request code
如果我从 Windows CMD 提示符运行此可执行文件,也会得到相同的结果。因此,显然这与 Cygwin 本身有关,而与 shell 环境无关。
2020 年 4 月 23 日更新:
测试文件的 icacls 输出
$ icacls $(cygpath -wa foo)
C:\cygwin64\home\sbaker\foo LOGFWA\sbaker:(R,W,D,WDAC,WO)
LOGFWA\Domain Users:(R)
Everyone:(R)
Successfully processed 1 files; Failed processing 0 files
strace 的输出很长,但这是与我的旧 Win7 机器上成功运行的命令的 strace 不同的第一部分:
101 188506 [main] rm 1688 _unlink_nt: Trying to delete \??\C:\cygwin64\home\sbaker\foo, isdir = 0
249 188755 [main] rm 1688 _unlink_nt: \??\C:\cygwin64\home\sbaker\foo, return status = 0xC0000002
102 188857 [main] rm 1688 seterrno_from_nt_status: /home/corinna/src/cygwin/cygwin-3.1.4/cygwin-3.1.4-1.x86_64/src/newlib-cygwin/winsup/cygwin/syscalls.cc:1116 status 0xC0000002 -> wind
ows error 1
144 189001 [main] rm 1688 geterrno_from_win_error: windows error 1 == errno 54
97 189098 [main] rm 1688 unlink: -1 = unlink(/home/sbaker/foo), errno 54
2020 年 4 月 30 日更新:
我在使用 WSL 时也遇到了类似的问题。
在 PowerShell 中,我得到:
PS C:\Users\sbaker> wsl
sbaker@FWA002495 /mnt/c/Users/sbaker $ touch foo
sbaker@FWA002495 /mnt/c/Users/sbaker $ rm foo
rm: remove regular empty file 'foo'? y
rm: cannot remove 'foo': Function not implemented
我还尝试从 Microsoft Store 在 Windows (20.04 LTS) 上安装 Ubuntu。运行该程序时,我可以成功从 Linux 文件空间 (/home/sbaker) 中删除文件,但如果我尝试从 /mnt/c 中删除文件,则会收到相同的错误:
PS C:\Users\sbaker> wsl
sbaker@FWA002495 /mnt/c/Users/sbaker $ touch foo
sbaker@FWA002495 /mnt/c/Users/sbaker $ rm foo
rm: remove regular empty file 'foo'? y
rm: cannot remove 'foo': Function not implemented