`ls` 尝试列出 WSL 上不存在的符号链接

`ls` 尝试列出 WSL 上不存在的符号链接

我已经全新安装了 Windows 10(内部版本 1803)。我已从 Microsoft Store 安装了 Ubuntu 并启用了 Linux 子系统。我过去曾多次这样做过,但从未遇到过以下问题:c由于符号链接,我的目录全部搞乱了。以dirincmdlsin WSL的输出为例:

C:\Users\username>dir
 Volume in drive C has no label.
 Volume Serial Number is BC00-A6D5

 Directory of C:\Users\username
05/25/2018  12:01 AM    <DIR>          .
05/25/2018  12:01 AM    <DIR>          ..
05/25/2018  12:01 AM    <DIR>          3D Objects
05/25/2018  12:01 AM    <DIR>          Contacts
05/25/2018  01:19 AM    <DIR>          Desktop
05/25/2018  12:01 AM    <DIR>          Documents
05/25/2018  12:01 AM    <DIR>          Downloads
05/25/2018  12:01 AM    <DIR>          Favorites
05/25/2018  12:01 AM    <DIR>          Links
05/25/2018  12:01 AM    <DIR>          Music
05/25/2018  12:06 AM    <DIR>          OneDrive
05/25/2018  12:01 AM    <DIR>          Pictures
05/25/2018  12:01 AM    <DIR>          Saved Games
05/25/2018  12:01 AM    <DIR>          Searches
05/25/2018  12:01 AM    <DIR>          Videos
               0 File(s)              0 bytes
              15 Dir(s)  88,018,132,992 bytes free

name:/mnt/c/Users/username$ ls
ls: cannot read symbolic link 'Application Data': Permission denied
ls: cannot read symbolic link 'Cookies': Permission denied
ls: cannot read symbolic link 'Local Settings': Permission denied
ls: cannot read symbolic link 'My Documents': Permission denied
ls: cannot read symbolic link 'NetHood': Permission denied
ls: cannot read symbolic link 'PrintHood': Permission denied
ls: cannot read symbolic link 'Recent': Permission denied
ls: cannot read symbolic link 'SendTo': Permission denied
ls: cannot read symbolic link 'Start Menu': Permission denied
ls: cannot read symbolic link 'Templates': Permission denied
3D Objects            NTUSER.DAT{c9e9d809-5fd7-11e8-a0cd-4e0bbe2b78ad}.TM.blf
AppData               NTUSER.DAT{c9e9d809-5fd7-11e8-a0cd-4e0bbe2b78ad}.TMContainer00000000000000000001.regtrans-ms
Application Data      NTUSER.DAT{c9e9d809-5fd7-11e8-a0cd-4e0bbe2b78ad}.TMContainer00000000000000000002.regtrans-ms
Contacts              ntuser.dat.LOG1
Cookies               ntuser.dat.LOG2
[...]

比较同一目录(左侧为 Ubuntu,右侧为 cmd),您会发现ls尝试列出不存在的符号链接!我从未遇到过这个问题,也没有更改任何权限或任何内容,所以我不知道发生了什么。谁能帮我这个?

以下是一些可能有用的信息:

坐骑给出

mount
rootfs on / type lxfs (rw,noatime)
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,noatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,noatime)
none on /dev type tmpfs (rw,noatime,mode=755)
devpts on /dev/pts type devpts (rw,nosuid,noexec,noatime,gid=5,mode=620)
none on /run type tmpfs (rw,nosuid,noexec,noatime,mode=755)
none on /run/lock type tmpfs (rw,nosuid,nodev,noexec,noatime)
none on /run/shm type tmpfs (rw,nosuid,nodev,noatime)
none on /run/user type tmpfs (rw,nosuid,nodev,noexec,noatime,mode=755)
binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,noatime)
C: on /mnt/c type drvfs (rw,noatime,uid=1000,gid=1000)

然后,

id -u
1000
id -g
1000

我的/etc/wsl.conf文件一开始不存在,所以我创建了一个;但是,我认为这不是解决问题的关键,因为mount已经表明c安装正确。现在是这个

[automount]
enabled = true

我的问题简而言之:在 cmd 中symlinks运行确认,我的目录中似乎没有。dir然而,Ubuntu 命令行显示符号链接。这是为什么?哦,另外,我无法删除它们(即使使用sudo rm),因为权限被拒绝。这有点烦人!

答案1

dir在 cmd 中运行已确认。

这并没有证实任何此类事情。使用命令/a的选项dir。如何dir在非Unix非Linux操作系统上使用该命令确实超出了本WWW站点的范围。因此,在指出这个问题的基本前提是错误的之后,我将在此停止。

答案2

我注意到如果你使用:

ls --color=tty

在目录 /mnt/c 中,您将收到以下错误消息:

ls: cannot read symbolic link 'Documents and Settings': Permission denied                                               
ls: cannot access 'hiberfil.sys': Permission denied                                                                     
ls: cannot access 'pagefile.sys': Permission denied                                                                     
ls: cannot access 'swapfile.sys': Permission denied

但如果您简单地使用/bin/ls而不带任何参数,您将获得一个干净的目录列表。因此,该命令试图对目录中的文件类型进行着色,从而触发了这些错误消息。

如果将 stderr 重定向到 /dev/null,这也会抑制错误消息:

alias ls='ls --color=tty 2>/dev/null'

并不总是可取的,但它确实可以消除噪音。

答案3

我参加聚会迟到了,但还是想发表评论。看起来这里的问题是ls --color=tty尝试访问符号链接来决定使用什么颜色,但该链接在 Windows 中无法访问。我可以忽略这些错误,但我想看到由此产生的其他错误,ls所以简单地这样做alias ls='ls --color=tty 2>/dev/null'并不能解决问题。相反,我建议使用这个别名:alias ls="ls --color=tty 2> >(grep -v 'ls: cannot read symbolic link.*Permission denied')"这会在 stderr 中搜索有问题的错误并将其过滤掉。

希望这可以减轻人们的挫败感。

相关内容