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


16

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

$ 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

Answers:


20

用于扩展*通配符的shell是您在其中键入通配符的shell。如果外壳有读取目录中的文件列表中的权限,然后将其扩展/temp/sit/build/*/temp/sit/build/file,并运行sudo的论据ls-l/temp/sit/build/file。如果shell无法找到任何匹配/temp/sit/build/*(不管是因为没有匹配,或者是因为外壳有没有权限看比赛),那么它独自离开模式,sudo被称为与参数ls-l/temp/sit/build/*

由于没有名为/temp/sit/build/*的文件,ls如果您传递该名称,该命令会抱怨。回想一下,ls这不会扩展通配符,这是Shell的工作。

如果要在没有读取权限的目录中进行通配符扩展,则扩展必须在其启动的外壳中进行,sudo而不是在调用中进行sudosudo不会自动启动外壳程序,您需要明确地执行该操作。

sudo sh -c 'ls -l /temp/sit/build/*'

当然,您可以在这里sudo ls -l /temp/sit/build/代替,但这不能推广到其他模式。


1

在极少数情况下,您需要仔细检查一下您是否没有禁用外壳的globbing,这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更多信息。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.