$ find . -name ‘*.blade.php’ -not -path ‘*/vendor/*’ | wc -l
几天前我运行了这个命令,一切正常。
今天运行它我得到:
-bash: find .: command not found
据我所知,我的系统没有任何变化。快速搜索没有返回与此问题相关的特定内容。认为发布此问题可能会对其他人有所帮助。
这是怎么回事?:)
答案1
我不太确定发生了什么,但我思考你在“find”和“.”之间看到了类似不间断空格的东西。不间断空格是 Unicode 字符,看就像普通空格一样,但并非用于指示换行文本的有效位置。但是,虽然它们看起来像普通空格,但 shell 不知道如何处理它们,只是将它们视为普通字符。这样做的一个后果是它无法将它们识别为命令与其参数之间的分隔符。以下是一个例子:
$ find . -name ‘*.blade.php’ -not -path ‘*/vendor/*’ | wc -l # With normal space
0
$ find . -name ‘*.blade.php’ -not -path ‘*/vendor/*’ | wc -l # With nonbreaking space
-bash: find .: command not found
0
$ find . -name ‘*.blade.php’ -not -path ‘*/vendor/*’ | wc -l # With ALL nonbreaking spaces
-bash: wc -l: command not found
-bash: find . -name ‘*.blade.php’ -not -path ‘*/vendor/*’ : No such file or directory
(请注意,我没有任何与模式匹配的文件,因此计数为 0。)第二个命令中发生的事情是,我在“find”和“.”之间有一个不间断空格(在我的 Mac 上键入为 Option-Space),因此 shell 将“find<nonbreakingspace>.”视为命令……无法识别。在第三个命令中,我将所有空格替换为不间断空格;它将“|”识别为命令之间的分隔符,但实际上行上的所有其他内容都是命令名称的一部分。
未找到命令“find .”的错误消息表明了正在发生的事情;它将类似空格的东西和“。”视为命令的一部分,因此它们以这种方式显示在错误消息中。
不过,有一件事让我很困惑:我不确定你一开始是如何得到不间断空格的。从 Notes 复制粘贴不应该进行任何转换。也许你不小心碰到了 Option?我不知道。
顺便说一句,我在编辑这篇文章时注意到了另一件事:你的单引号是花哨的(弯曲的)unicode 引号,看就像完美的引号,但就像不间断空格一样,shell 无法识别这种引号。我知道这个的来源:在许多情况下,macOS 会自动将普通引号“更正”为花哨的类型(称为“智能引号”的功能)。这往往会对脚本造成严重破坏。我会推荐BB編輯它是一个优秀的编辑器,不会弄乱您输入的内容,非常适合编写脚本。它不是免费的,但即使您不付费,它也会以受限模式运行,这仍然比内置编辑器更适合编写脚本。