bash 的 * 如何传递给程序?

bash 的 * 如何传递给程序?

当我evince *在一个包含大量 pdf 的文件夹中输入内容时,会向 evince 发送什么?evince 是否接收 X 个参数,或者是否打开 X 个 evince 场合,每个场合都接收一个参数(单个文件)?

答案1

Bash 对每个命令行执行 shell 扩展。其中一个扩展是文件名扩展根据*模式匹配規則。

如果是evince *,它会用*当前工作目录的内容替换 。内容是指常规文件、子目录、链接等的名称。不包括点文件。基本上就是运行 后得到的结果ls。在您的情况下是 PDF 的文件名。

因此,evince二进制文件仅由 Bash 执行一次,参数是当前工作目录中按字母顺序排列的文件名。Evince 随后处理其启动的方式取决于 Evince 或它所依赖的任何框架或库,但基本的 X 不会在这里做任何特别的事情。Evince 或 X 甚至不知道它已通过 执行*。例如:

$ ls -a
. .. .hiddendoc.pdf doc1.pdf doc2.docx otherdoc.pdf somedir
$ evince *
# is equivalent to
$ evince doc1.pdf doc2.docx otherdoc.pdf somedir

如果你想知道如何*展开,只需运行echo *。你可能会注意到,如果工作目录为空(仅包含点文件),星号就不会展开,而是作为命令执行的参数保留。

正如链接的 Bash 手册中提到的,有许多设置可以改变此行为。更不用说其他 shell 了。

相关内容