带有目录路径的 ls 显示文件,但是带有文件模式的 ls 不显示?

带有目录路径的 ls 显示文件,但是带有文件模式的 ls 不显示?

为什么会发生这种情况?

$ 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 可以展开*

相关内容