我使用了该*
命令,并看到了此错误:
bash: boot: command not found
为什么会出现这个错误?
答案1
您在命令行中键入的第一个单词将被 shell 解释为命令的名称。
shell 会将*
文件名通配字符扩展为当前目录中的所有可见名称。名称将按字典顺序排序。
您所在的目录中的名称boot
是排在第一位的名称。这意味着只需输入*
在该特定目录中boot
将与尝试运行使用该目录中的所有其他名称作为命令行参数调用的命令相同。
boot
在您的系统上,当前的 中没有调用任何命令$PATH
,因此 shell 会抱怨找不到它。
就是这样。
我的系统上的示例(运行zsh
shell 而不是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
(恰好是目录的名称)*
在我所在目录中的文件名通配模式的扩展中排在第一位。
通过文件名通配模式选择要运行的命令容易出错且危险,因此最好避免。
作为一个有点相关的轶事,我相信我见过用户创建一个名为-i
in 包含重要文件的目录的文件。所以他们可能有类似的东西
$ 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
在删除任何文件之前要求确认。然后他们有机会中止手术。
这是一个有趣的小技巧,但根本不是解决意外删除文件问题的正确方法。正确的解决方案是那问题是定期进行备份。