回声命令输出" -n"在Makefile的文件中

时间:2014-09-14 19:05:15

标签: makefile echo zsh

我有一个包含这种命令的Makefile:

browserify:
    rm -rf ./dist
    mkdir dist
    # Browserify
    echo -n "/* ${NPM_PACKAGE} ${NPM_VERSION} ${GITHUB_PROJ} */" \
        > dist/pica.js

因此,当我make browserify时,它应该在没有\n的情况下将注释输出到文件的顶部。但由于某些原因......输出看起来像这样

-n /* package 0.0.0 */
...more things...

我在osx上使用zsh。

1 个答案:

答案 0 :(得分:5)

使用什么外壳并不重要。 make 总是使用/bin/sh作为它调用的shell(除非您专门将SHELL make变量设置为其他内容)。想想如果使用用户用来调用食谱的任何shell,那将是一场灾难!

在许多GNU / Linux系统上,/bin/sh实际上是指向bash的链接。在其他GNU / Linux系统上,/bin/sh是指向dash的链接,这是一个小型的POSIX标准shell,没有bash使用的所有扩展名dash适合运行便携式shell脚本速度快,但不适合用户的交互式shell,因为它缺少太多预期的功能)。在非基于GNU的系统(如OSX)上,/bin/sh可能是ksh或其他内容。

没有可移植的标准方法来调用echo,因为它不会打印尾随换行符。有一个echo程序,不同的程序有不同的工作方式。许多shell(包括bashzsh)也有一个echo内置到shell中:

$ type -a echo
echo is a shell builtin
echo is /bin/echo

这些版本的echo也与程序echo的工作方式不同。某些版本无法抑制换行符。有些人使用-n标志。有些人在末尾使用\c来禁止打印换行符。有些人支持他们的组合。

简短的回答是,如果你想以便携和可靠的方式在没有换行的情况下在shell中打印一行,你应该使用printf程序来做,而不是echo:< / p>

browserify:
        rm -rf ./dist
        mkdir dist
        # Browserify
        printf %s "/* ${NPM_PACKAGE} ${NPM_VERSION} ${GITHUB_PROJ} */" \
            > dist/pica.js