为什么会发生这种情况?
$ sudo ls /var/lib/postgresql/9.4/pg_log/
postgresql-2015-03-23_134626.log postgresql-2015-03-25_000000.log postgresql-2015-03-25_095920.log
postgresql-2015-03-24_000000.log postgresql-2015-03-25_095626.log
$ sudo ls /var/lib/postgresql/9.4/pg_log/*
ls: cannot access /var/lib/postgresql/9.4/pg_log/*: No such file or directory
ls /path/to/dir/
显示文件,但ls /path/to/dir/*
说未找到文件。
为什么是这样?
答案1
shell 会扩展通配符前sudo 运行。当前用户无法访问文件,因此字符串按字面意思传递给 ,sudo
稍后ls
.ls
不会扩展通配符(这是 shell 的职责),因此它找不到名为 的文件*
。
通过引用保护通配符并调用根 shell 来扩展它:
sudo sh -c 'ls /var/lib/postgresql/9.4/pg_log/*'
答案2
您遇到的问题涉及
sudo
无法写给/etc/profile
和如何附加到文件sudo
?以及谁负责*
处理echo *
? 你的主要外壳解释您输入的每个命令,包括通配符(也称为 glob 或文件名模式)。如果您输入
一些命令*
shell 枚举当前目录中的文件并将它们传递给命令;例如,
一些命令黑色 蓝色 棕色 绿色 橙色 红色 白色 黄色
嗯,如果你没有权限读取/var/lib/postgresql/9.4/pg_log
,则您的 shell 没有权限枚举/var/lib/postgresql/9.4/pg_log/*
。事实上,当命令运行,它作为 运行root
,为时已晚——路径名扩展(即通配符解释)那时已经完成。
您可以使用我在前两个问题中讨论的技巧来解决这个问题:
sudo sh -c "ls /var/lib/postgresql/9.4/pg_log/*"
这将运行一个特权 shell。然后,特权 shell 可以展开*
。