Make 无法检查目录是否存在

发布于 2024-10-30 21:01:55 字数 668 浏览 0 评论 0原文

我用谷歌搜索了这个,但我不明白为什么 Bash 会抱怨以下代码来检查目录是否存在:

test.mk

#!/bin/bash

MYDIR="dl"
all:
        if [ ! -d $MYDIR ]; then
        #if [ ! -d "${MYDIR}" ]; then
        #if [ ! -d ${MYDIR} ]; then
                #Here
        fi

make -f test.mk

if [ ! -d YDIR ]; then
/bin/sh: Syntax error: end of file unexpected
make: *** [all] Error 2

有人知道它为什么失败吗?为什么它调用 /bin/sh 而不是 /bin/bash?谢谢。


编辑:与 Bash 不同,make 不支持多行块。这是工作代码:

MYDIR="dl"
all:
        if [ ! -d ${MYDIR} ]; then\
                echo "Here";\
        else\
                echo "There";\
        fi

I googled for this, but I can't figure out why Bash complains with the following code to check if a directory exists:

test.mk

#!/bin/bash

MYDIR="dl"
all:
        if [ ! -d $MYDIR ]; then
        #if [ ! -d "${MYDIR}" ]; then
        #if [ ! -d ${MYDIR} ]; then
                #Here
        fi

make -f test.mk

if [ ! -d YDIR ]; then
/bin/sh: Syntax error: end of file unexpected
make: *** [all] Error 2

Does someone know why it fails? And why does it call /bin/sh instead of /bin/bash? Thank you.


Edit: unlike Bash, make doesn't support multi-line block. Here's working code:

MYDIR="dl"
all:
        if [ ! -d ${MYDIR} ]; then\
                echo "Here";\
        else\
                echo "There";\
        fi

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

老街孤人 2024-11-06 21:01:55

您在顶部插入的 #!/bin/bash shebang 没有用,它被 make 视为注释。

make 默认将命令发送到 /bin/sh。要指定不同的 shell,请使用宏 SHELL = /bin/bash

此外,您需要转义变量:

if [ ! -d ${MYDIR} ]

我不确定 make 是否可以处理多行语句,因此尝试将所有 if 块放在一行中。

if [ ! -d ${MYDIR} ]; then DO_SOMETHING; DO_SOMETHING_ELSE; fi

The #!/bin/bash shebang that you inserted at top is useless, and it is treated by make as a comment.

make sends by default commands to /bin/sh. To specify a different shell, use the macro SHELL = /bin/bash.

Moreover, you need to escape your variable:

if [ ! -d ${MYDIR} ]

I'm not sure if make can handle multi-line statements, so try to put all the if block in a line.

if [ ! -d ${MYDIR} ]; then DO_SOMETHING; DO_SOMETHING_ELSE; fi
冷血 2024-11-06 21:01:55

您将 test.mk 提供给 make,而不是 bash。然后 make 将单独的行发送到 shell,而不是整个块。

make 使用其 SHELL 宏来确定要使用哪个 shell。您可以覆盖它以使其使用 bash

您得到 YDIR 的原因是 make 对于变量插值有愚蠢的规则。写入$(MYDIR),而不是$MYDIR

You're feeding test.mk to make, not to bash. Then make sends individual lines to the shell, not whole blocks.

make uses its SHELL macro to determine which shell to use. You can override it to make it use bash.

The reason why you're getting YDIR is that make has silly rules about variable interpolation. Write $(MYDIR), not $MYDIR.

森林迷了鹿 2024-11-06 21:01:55

尝试支撑你的变量:

${MYDIR}

try bracing your variable:

${MYDIR}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文