为什么 shell 不能仅通过名称在当前目录中找到文件?

Sae*_*ati 4 command-line apt scripts

.deb为 Ubuntu下载了 VS Code 的文件。我将其重命名为vs.deb.

然后我去我的下载目录:

cd ~/Downloads
Run Code Online (Sandbox Code Playgroud)

现在我在这里,我尝试安装它:

sudo apt install vs.deb
Run Code Online (Sandbox Code Playgroud)

这就是我得到的:

Reading package lists... Done   
Building dependency tree          
Reading state information... Done   
E: Unable to locate package vs.deb   
E: Couldn't find any package by glob 'vs.deb'
Run Code Online (Sandbox Code Playgroud)

但是当我使用 安装它时./vs.deb,它会被安装:

sudo apt install ./vs.deb
Run Code Online (Sandbox Code Playgroud)

为什么Linux不接受同目录内的文件名而不需要相对路径?

van*_*ium 18

您所经历的与 shell 无关,而是与apt命令如何解释命令行上的参数有关。

它主要用于从软件存储库安装软件包。默认情况下,参数 toapt表示软件源中包的名称。消息:

E: Unable to locate package vs.deb
Run Code Online (Sandbox Code Playgroud)

清楚地表明软件包vs.deb不存在于软件源中。

仍然apt允许您直接安装下载的.deb包文件并为其解析依赖项。您必须提供一个明确的文件路径以表明您要安装.deb文件。./vs.deb已经表示文件路径:./表示当前目录,所以apt会vs.deb在当前目录中找到文件。

实际上,“找到”文件的从来都不是 shell。shell 只是将参数传递给应用程序,由应用程序来解释这些参数。至多,shell 执行扩展(例如,替换*为所有文件名或~主文件夹的完整路径)或变量替换(例如$HOME,替换为该变量的内容)。

  • `apt` 的前身 `apt-get` 永远不能将 `.deb` 作为命令行选项,只有一个包名;你必须使用 `dpkg -i` 来安装一个 .deb 文件。因此,Debian 的高级软件包工具有历史先例 * 不* 将 args 解释为路径,至少默认情况下不会。 (2认同)