【问题标题】:makefile C strange bash command behaviormakefile C 奇怪的 bash 命令行为
【发布时间】:2014-11-11 21:27:08
【问题描述】:

我正在尝试使用 clean 创建 makefile 文件。

我的 clean 看起来像(它应该从位置擦除除 *.c 源文件之外的所有内容)。

clean:
    rm !(*.c)

当我尝试在终端中执行make clean 时,我得到了

User 1# make clean
rm !(*.c)
/bin/sh: 1: Syntax error: "(" unexpected
make: *** [clean] Error 2

但是当我在终端中输入rm !(*.c) 时它工作正常。

为什么用makefile写的命令不起作用?

【问题讨论】:

  • 明确说明要传递给rm的文件更安全;您不知道何时可以创建要保留的非.c 文件,但忘记更新配方。
  • 我完全意识到风险,但现在我只想让 rm !(*.c) 工作。
  • 这一行:rm !(*.c) 也会删除你的makefile。可能不是你想要的。

标签: c bash makefile


【解决方案1】:

您正在终端中运行bashmake 正在通过默认的 SHELL 运行该配方行,即 /bin/sh

您可以在您的 makefile 中设置 SHELL := /bin/bash 以选择不同的 shell 来执行其配方行,或者您可以手动运行 bash -c 'rm !(*.c)' 作为您的配方行,或者您可以使用不同的方法来选择要清理的文件。

来自 cmets 的更新(感谢@chepner):

必须启用extglob 才能使用!(*.c)。它还必须在解析使用它的行之前设置(因此bash -c 'shopt -s extglob; rm !(*.c)' 不起作用)。

因此可用的选项是使用bash -O extglob -c 'rm !(*.c)'(这可能是最好的答案)来设置SHELL := bash -O extglob(在make 3.81 中工作,但对于新版本的make 需要以不同的方式完成)或使用heredoc。

bash <<EOF
shopt -s extglob
rm !(*.c)
EOF

虽然我不相信在 makefile 配方中可以使用 heredoc 选项。

【讨论】:

  • 请注意,如果使用 bash 路由,您还必须确保设置了扩展 glob 选项,我认为只有在显式运行 bash -c 'shopt -s extglob; rm !(*.c)' 时才能做到这一点。
  • @chepner 很有可能。我假设在他们使用的任何版本的bash 中默认情况下都处于启用状态,但他们可能只是在初始化文件中设置它。
  • 它仍然给我一个错误(字符意外尝试了 3 个带有 bash -c 'rm !(.c)' 和 bash -c 'shopt -s extglob; 的 SHELL 变量的版本; rm !(.c)'
  • 看来shopt -s extglob 必须在使用扩展模式的行被解析 之前执行,这意味着像shopt -s extglob; rm !(*.c) 这样的东西将不起作用。这意味着您不能在 -c 选项的参数中使用它。
  • 啊,我知道我忽略了一个选项:bash -O extglob -c 'rm !(*.c)'
【解决方案2】:

最好只使用便携式外壳,而不是尝试使用 bash 特定功能:

ls -1 | grep -v '\.c$' | xargs rm -f

如果您的文件名可能包含空格,我承认这不会很好。

【讨论】:

  • 我不建议解析来自ls 的输出,但这里的总体思路肯定是一个不错的思路。 (我可能会使用find ... -print0 | xargs -o rm -f。)
  • 你的意思是xargs -0 不是xargs -o。如果您使用find 复制全局,则必须使用-maxdepth 1,不幸的是-print0 标志等不是标准的;它们只存在于 GNU find 中。我觉得我不应该在一篇关于使用便携版工具的帖子中使用它们:)。
  • 是的,当我跑到门外时打错了。是的,便携性在那里受到了一些影响。虽然主要在xargs 端,因为您始终可以在find 端使用-printf "..\0"。如有必要,甚至可以在bash 中手动循环使用read
猜你喜欢
  • 1970-01-01
  • 2012-01-03
  • 1970-01-01
  • 2021-07-07
  • 1970-01-01
  • 1970-01-01
  • 2015-03-28
  • 1970-01-01
  • 2012-04-05
相关资源
最近更新 更多