当我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 了。