mkdir 在 Makefile 和终端中的不同行为

mkdir different behavior in Makefile and Terminal

我在 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'

我找不到问题。

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

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

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

{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 什么不是。