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

Loï*_*oix 0 zsh makefile echo

我有一个具有这种命令的Makefile:

browserify:
    rm -rf ./dist
    mkdir dist
    # Browserify
    echo -n "/* ${NPM_PACKAGE} ${NPM_VERSION} ${GITHUB_PROJ} */" \
        > dist/pica.js
Run Code Online (Sandbox Code Playgroud)

因此,当我这样做时make browserify,应该将注释输出到文件顶部而不是\n.但由于某些原因......输出看起来像这样

-n /* package 0.0.0 */
...more things...
Run Code Online (Sandbox Code Playgroud)

我在osx上使用zsh.

Mad*_*ist 5

你正在使用什么外壳并不重要.请将一直使用/bin/sh,因为它会调用(除非你专门设置的外壳SHELLmake变量别的东西).想想如果使用用户使用的任何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,包括bash并且zsh还有一个echo内置的shell:

$ type -a echo
echo is a shell builtin
echo is /bin/echo
Run Code Online (Sandbox Code Playgroud)

这些版本的echo工作方式也与程序不同echo.某些版本无法抑制换行符.有些人使用-n旗帜.最后一些用于\c抑制打印换行.有些人支持他们的组合.

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

browserify:
        rm -rf ./dist
        mkdir dist
        # Browserify
        printf %s "/* ${NPM_PACKAGE} ${NPM_VERSION} ${GITHUB_PROJ} */" \
            > dist/pica.js
Run Code Online (Sandbox Code Playgroud)