gpt4 book ai didi

bash - 生成文件 `echo -n' 不工作

转载 作者:行者123 更新时间:2023-11-29 08:43:07 25 4
gpt4 key购买 nike

我试图让我的 Makefile 回显文本时没有尾随换行符,但我做不到。我遇到了 OS X 上的行为(在 Linux 上一切正常)。

生成文件

a:
@echo -n "hello"

b:
@echo -n hello

c:
@/bin/echo -n "hello"

输出:

$make a
-n hello
$make b
hello$make c
hello$

换句话说,make a 被破坏了。究竟发生了什么? make 使用的是内置 echo 吗?显然双引号的存在改变了行为,但为什么呢?

更新

@chepner 发现,在 makefile 中使用 /bin/echo 的完整路径可以正确理解 -n 标志。

最佳答案

问题来自于两个事实的不幸相互作用。

首先,make 有两种操作模式,具体取决于要运行的配方的复杂程度:

  • 如果命令简单make 将使用其内置命令直接运行配方。这就是您的 b 案例中发生的情况。
  • 如果命令复杂make 将生成一个 shell 来解释和运行配方。这就是您的 a 案例中发生的情况。

其次,make 使用 /bin/sh 作为 shell,但 /bin/sh 的功能在 Mac OS X 上的实现方式不同和 Linux:

  • 在 Mac OS X 上,/bin/sh 的功能由 bash 实现。同样在 Mac OS X 上,bash 是使用 --enable-strict-posix-default 编译的。此标志的一个结果是 echo 命令不理解 -n 标志。
  • 在 Linux 上,/bin/sh 的功能由 dash 实现,它在 POSIX 规范方面不太严格。因此 -n 标志在 echo 命令中实现。

顺便说一句,Makefile buitlin echo 命令理解 -n 标志,这解释了为什么 b 情况总是有效。

解决问题的简洁且可移植的方法是将 @echo -n 配方替换为 @printf 配方。

关于bash - 生成文件 `echo -n' 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11675070/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com