【问题标题】:syntax error near unexpected token '(' in bash script when selecting files [extend]选择文件时 bash 脚本中的意外标记“(”附近出现语法错误 [扩展]
【发布时间】:2021-11-13 05:05:52
【问题描述】:

类似于here的问题,但对于我的用例,我想放在makefile中。

#!/bin/bash

# Example: 
#   make run TEST_CASE="testbench.sv"
#   make clean

compile:
    vcs $(TEST_CASE) -sverilog;

run: compile
    ./simv

uvm_compile:
    vcs $(TEST_CASE) -sverilog;

clean:
    shopt -s extglob;
    rm -v !(*.sv|*svh|"makefile");

make clean 中存在问题,结果如下:

ycliao@localhost:[~/workspace/i2c_vip/uvm_practice]: make clean
shopt -s extglob;
rm -v !(*.sv|*svh|"makefile");
/bin/sh: -c: line 0: syntax error near unexpected token `('
/bin/sh: -c: line 0: `rm -v !(*.sv|*svh|"makefile");'
make: *** [clean] Error 1

【问题讨论】:

  • 在配方的第一行添加一个续行(反斜杠)。确保它是该行的最后一个字符。编写配方时,这两行代码在两个不同的 shell 中执行,extglob 选项仅针对第一个 shell 设置。其他可能性:使用.ONESHELL GNU make 功能或将配方写在一行上。注意:除了clean 配方的第一行,其他所有分号都没用。
  • 正如您提到要添加的“反斜杠”,我不明白这一点。你能告诉我如何修改当前代码吗?非常感谢。
  • 你知道反斜杠是什么吗?它看起来像这样:\.只需在行尾添加一个shopt -s extglob;。
  • 即使这样,它也不会按原样工作。至少,不是便携的。该行为在 POSIX shell 中不可用,它只能在 bash 中工作。但是make默认不调用bash,它调用/bin/sh。在某些系统上,/bin/sh 实际上是 bash,它会起作用。在其他系统上,/bin/sh 是一个简单的 POSIX shell,它会失败。如果您想始终使用bash,则必须设置变量SHELL = /bin/bash。
  • 感谢您的回复,所以在makefile中没有``` shopt -s extglob ``` ?

标签: bash makefile


【解决方案1】:

据我了解,makefile 的每一行都在单独的 shell 中执行。所以你需要添加一个续行来连接命令,以便它们在 same shell 中执行:

SHELL = /bin/bash

# ...

clean:
    shopt -s extglob; \
    rm -v !(*.sv|*svh|"makefile");

这在维基百科 Make 页面上的 Example makefiles 中得到了演示。

【讨论】:

  • 这也是我尝试过的方式,但不适合我
  • ycliao@localhost:[~/workspace/i2c_vip/uvm_practice]: make clean shopt -s extglob; \ rm -v !(.sv|*svh|"makefile"); /bin/bash: -c: line 1: 意外标记附近的语法错误(' /bin/bash: -c: line 1: rm -v !(.sv|*svh|"makefile");' make: *** [clean] 错误 1
  • 看来还是不行。我对问题进行了总结。
【解决方案2】:

我相信这个问题是一个 bash 问题。出于某种原因,似乎不可能在 shopt 之后执行一些命令作为单行。让我们完全摆脱图片。在 bash shell 中:

$ ls -1 /tmp/hosts.tar.*
/tmp/hosts.tar.bz2
/tmp/hosts.tar.gz
$ shopt -s extglob ; ls -1 /tmp/hosts.tar.@(bz2|gz)
bash: syntax error near unexpected token `('
$ ls -1 /tmp/hosts.tar.@(bz2|gz)
bash: syntax error near unexpected token `('
$ shopt -s extglob
$ ls -1 /tmp/hosts.tar.@(bz2|gz)
/tmp/hosts.tar.bz2
/tmp/hosts.tar.gz

【讨论】:

    【解决方案3】:

    总结一下,对于makefile,是不允许有这个的。

    ycliao@localhost:[~/workspace/i2c_vip/uvm_practice]: make clean
    shopt -s extglob; \
    rm -v !(*.sv|*svh|"makefile");
    /bin/bash: -c: line 1: syntax error near unexpected token `('
    /bin/bash: -c: line 1: `rm -v !(*.sv|*svh|"makefile");'
    make: *** [clean] Error 1
    

    【讨论】:

    • @glenn jackman 获取错误信息
    • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。
    猜你喜欢
    • 2018-04-28
    • 2015-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 2016-09-06
    • 2015-06-08
    相关资源
    最近更新 更多