为什么“*”命令的输出是boot?

为什么“*”命令的输出是boot?

我使用了该*命令,并看到了此错误:

bash: boot: command not found

为什么会出现这个错误?

答案1

您在命令行中键入的第一个单词将被 shell 解释为命令的名称。

shell 会将*文件名通配字符扩展为当前目录中的所有可见名称。名称将按字典顺序排序。

您所在的目录中的名称boot是排在第一位的名称。这意味着只需输入* 在该特定目录中boot将与尝试运行使用该目录中的所有其他名称作为命令行参数调用的命令相同。

boot在您的系统上,当前的 中没有调用任何命令$PATH,因此 shell 会抱怨找不到它。

就是这样。

我的系统上的示例(运行zshshell 而不是bash,但在这方面它的工作原理相同):

% cd /
% ls
altroot    bsd        bsd.sp     home       sbin       usr
bin        bsd.booted dev        mnt        sys        var
boot       bsd.rd     etc        root       tmp
% *
zsh: command not found: altroot

当我使用 just 时*,shell 会尝试运行名为 的命令altroot,因为名称altroot(恰好是目录的名称)*在我所在目录中的文件名通配模式的扩展中排在第一位。

通过文件名通配模式选择要运行的命令容易出错且危险,因此最好避免。


作为一个有点相关的轶事,我相信我见过用户创建一个名为-iin 包含重要文件的目录的文件。所以他们可能有类似的东西

$ ls -l
total 0
-rw-r--r--  1 myself  wheel  0 Apr 16 18:49 -i
-rw-r--r--  1 myself  wheel  0 Apr 16 18:49 important-file-1.txt
-rw-r--r--  1 myself  wheel  0 Apr 16 18:49 important-file-2.txt
-rw-r--r--  1 myself  wheel  0 Apr 16 18:49 important-file-3.txt

请注意首先如何-i排序?这意味着当他们rm -rf *(错误地)在此目录中执行此操作时,会发生这种情况:

$ rm -rf *
remove important-file-1.txt? n
remove important-file-2.txt? n
remove important-file-3.txt? n

也就是说,该-i名称作为 的选项插入rm -rf,这使得rm在删除任何文件之前要求确认。然后他们有机会中止手术。

这是一个有趣的小技巧,但根本不是解决意外删除文件问题的正确方法。正确的解决方案是问题是定期进行备份。

相关内容