未经适当许可无法扩展星号

未经适当许可无法扩展星号

有人可以向我解释以下内容吗?

$ 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更多信息。

相关内容