有人可以向我解释以下内容吗?
$ ls -ld /temp/sit/build/
dr-xr-s--- 3 asdf qwer 4096 Jan 31 2012 /temp/sit/build/
$ ls -ld /temp/sit/build/*
ls: /temp/sit/build/*: Permission denied
显然,我不能在这里使用星号。我已经使用 sudo 命令尝试过,但收到“没有此类文件”错误,而不是“权限被拒绝”...
sudo ls -l /temp/sit/build/*
ls: /temp/sit/build/batch*: No such file or directory
但如果我不使用 * 它最终会起作用
sudo ls -l /temp/sit/build/
total 4
dr-xr-s--- 11 asdf qwer 4096 Oct 3 23:31 file
答案1
执行通配符扩展的 shell*
是您在其中键入通配符的 shell。如果 shell 有权读取目录中的文件列表,则它会扩展/temp/sit/build/*
为/temp/sit/build/file
, 并sudo
使用参数ls
,-l
和运行/temp/sit/build/file
。如果 shell 无法找到 的任何匹配项/temp/sit/build/*
(无论是因为没有匹配项,还是因为 shell 无权查看匹配项),则它会单独保留该模式,并sudo
使用参数ls
,-l
和进行调用/temp/sit/build/*
。
由于没有名为 的文件/temp/sit/build/*
,ls
因此如果您将该名称传递给命令,该命令会发出抱怨。回想一下,它ls
不会扩展通配符,那是 shell 的工作。
如果您希望在没有读取权限的目录中进行通配符扩展,则扩展必须在由 启动的 shell 中进行,sudo
而不是在调用sudo
.sudo
不会自动启动 shell,您需要显式地执行此操作。
sudo sh -c 'ls -l /temp/sit/build/*'
当然,在这里您可以这样做sudo ls -l /temp/sit/build/
,但这并不能推广到其他模式。
答案2
在极少数情况下,您需要仔细检查您的 shell 是否禁用了通配符,这可能会在您No such file or directory
尝试使用通配符 ( *
) 列出文件时出现问题。
例如:
$ ls /tmp/sit/build/*
/tmp/sit/build/file
$ set -f
$ ls /tmp/sit/build/*
ls: cannot access /tmp/sit/build/*: No such file or directory
$ set +f
$ ls /tmp/sit/build/*
/tmp/sit/build/file
检查help set
更多信息。