Windows 11 GNU make-无法识别“cat”

Windows 11 GNU make-无法识别“cat”

我做了一个愚蠢的决定,把我的工作环境搬到Windows 11

我已经下载了使用 chocolatey 的 GNU Make 版本 4.3'cat' is not recognized as an internal or external command, operable program or batch file.。当我提示它输入版本时,它会做出回复,但当我要求它构建我的项目时,它会返回错误。

我正在Windows Powershell 版本 5.1.22000.1335,我可以在其中运行“$cat ExampleFile.txt”并查看预期行为。我甚至可以找到别名表,显示 Powershell 将 cat 转换为 Get-Content,但由于某种原因,此别名未应用于 make 系统内的调用。我是否应该将 Powershell 别名 cat 应用于其他命令?

有人解决过此类问题吗?谢谢阅读!

答案1

“您的项目”在其构建过程中使用的事实cat表明它很可能是一个针对(至少最初)Linux(或其他类 UNIX 操作系统)的项目。

在这种情况下(或者甚至在任何情况下都不是 VS 项目?),你可能需要一个完整的工具链等。等(嗯,例如cat无论如何,系统管理软件可能是您想要考虑的选择之一。它提供了不同的 shell,这些 shell 设置为允许构建程序的本机 Windows (mingw) 版本或 msys2 版本(依赖于 msys2 提供的 POSIX 兼容层/库)。

注意,是否可以像前者一样构建程序取决于程序本身的可移植性。


w64devkit温利布斯是您可能感兴趣的替代方案。(但不确定您是否会得到cat后者。)


GNU Make 实际上只是一个处理 Makefile 的程序。它是否足以满足您的“项目”需求取决于 Makefile 指示的具体运行内容(直接或间接)。

cat是 GNU coreutils 的一部分。(嗯,我想有不同的实现cat;例如,您也可以cat从 busybox 获得。)我不确定是否还能为 Windows 构建它的本机版本。不过,显然有一个古老的端口,您也可以通过 chocolatey 获得。(另一个选择可能是

答案2

至于这个,

"$cat ExampleFile.txt"

以这种方式指定的 $cat 或 "$cat" 是一个变量。

"$cat D:\temp\TestFile.txt"
# Results
<#
 "$cat D:\temp\TestFile.txt"
The variable '$cat' cannot be retrieved because it has not been set.
At line:1 char:2
+ "$cat D:\temp\TestFile.txt"
+  ~~~~
    + CategoryInfo          : InvalidOperation: (cat:String) [], RuntimeException
    + FullyQualifiedErrorId : VariableIsUndefined
#> 

PS 将评估变量中的值/数据$cat,而不是运行cat命令。

查看有关 PowerShell 变量扩展的可用信息。

https://devblogs.microsoft.com/powershell/variable-expansion-in-strings-and-here-strings/

如上所述,cat是 的别名Get-Content,必须以此方式使用。

为了使命令起作用,您必须这样做。

cat 'D:\temp\TestFile.txt'
# Results
<#
1   21/05/20
2   21/05/20
3   21/05/20
4   21/05/20
5   21/05/20
6   21/05/20
7   21/05/20
8   21/05/20
#>

除非你这样做……

$cat = cat

... 代码中的其他地方。这意味着您将命令分配给了变量名。这对于单个注释来说并不十分谨慎。

如果您在此用例中尝试这样做,它仍然会失败。

$cat = cat
"$cat D:\temp\TestFile.txt"
# Results
<#
 $cat = cat
"$cat D:\temp\TestFile.txt"
cmdlet Get-Content at command pipeline position 1
Supply values for the following parameters:
Path[0]:
#>

要使上述变量发挥作用,您必须将其声明为函数或 ScriptBlock。恕我直言,如果您这样做,只会让事情变得过于复杂。

# using a ScriptBlock
$cat = {cat $($args[0])}
& $cat 'D:\temp\TestFile.txt'
# Results
<#
1   21/05/20
2   21/05/20
3   21/05/20
4   21/05/20
5   21/05/20
6   21/05/20
7   21/05/20
8   21/05/20
#>

关于脚本块

https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_script_blocks?view=powershell-7.3

最后,要发现任何外部命令,它必须位于您的系统和 PS 路径中。

另请参阅 PS 命令优先级

https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_command_precedence?view=powershell-7.3

PowerShell-运行可执行文件- TechNet 文章 - 美国(英语) - TechNet Wiki

https://social.technet.microsoft.com/wiki/contents/articles/7703.powershell-running-executables.aspx

相关内容