【问题标题】:mkdir different behavior in Makefile and Terminalmkdir Makefile 和终端中的不同行为
【发布时间】:2015-04-08 13:28:23
【问题描述】:

我在 Linux Ubuntu 14 中遇到 mkdir 命令的问题。我想在同一级别创建多个目录,所以在 Makefile 中我做了类似的事情。

mkdir -v /opt/dir/{dir1,dir2,dir3}

它的输出就像

mkdir: created directory '/opt/dir/{dir1,dir2,dir3}'

但是当我直接在终端上运行这个命令时,我得到了预期的结果。

'mkdir: created directory /opt/dir/dir1'
'mkdir: created directory /opt/dir/dir2'
'mkdir: created directory /opt/dir/dir3'

我找不到问题。

任何建议都会有所帮助。 提前致谢。

【问题讨论】:

    标签: makefile mkdir


    【解决方案1】:

    在我看来,问题不在于 mkdir 的工作方式不同,而是您在终端中使用的 shell 与 make 用来运行命令的 shell 不同。默认情况下,make(gnu 或其他)使用 /bin/sh。

    尝试将SHELL=/bin/bash 添加到您的makefile。

    【讨论】:

    • 设置SHELL 是一个坏主意,因为它使makefile 不可移植。
    【解决方案2】:

    带有{a,b,c} 的大括号扩展是一个不可移植的shell 扩展,make 使用的/bin/sh 无法理解。你应该拼出目录,如

    mkdir -v /opt/dir/dir1 /opt/dir/dir2 /opt/dir/dir3
    

    或使用

    for d in dir1 dir2 dir3; do mkdir -v /opt/dir/$$d; done
    

    这再次说明了可移植 shell 编程的重要性。 Know what is POSIX shell 而不是。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 2020-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多