“回波命令输出”-";在Makefile中的文件中

“回波命令输出”-";在Makefile中的文件中,makefile,echo,zsh,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 /* pack

我有一个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。

无论您使用的是什么shell。Make将始终使用
/bin/sh
作为其调用的shell(除非您专门将
shell
Make变量设置为其他变量)。想想看,如果make使用用户用来调用菜谱的任何shell,那将是一场多么大的灾难

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

没有可移植的标准方法来调用
echo
,这样它就不会打印尾随的换行符。有一个
echo
程序,不同的程序工作方式不同。许多shell,包括
bash
zsh
也在shell中内置了
echo

$ type -a echo
echo is a shell builtin
echo is /bin/echo
而且这些版本的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

不管你用的是什么外壳。Make将始终使用
/bin/sh
作为其调用的shell(除非您专门将
shell
Make变量设置为其他变量)。想想看,如果make使用用户用来调用菜谱的任何shell,那将是一场多么大的灾难

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

没有可移植的标准方法来调用
echo
,这样它就不会打印尾随的换行符。有一个
echo
程序,不同的程序工作方式不同。许多shell,包括
bash
zsh
也在shell中内置了
echo

$ type -a echo
echo is a shell builtin
echo is /bin/echo
而且这些版本的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

-n是一个bash扩展,我认为它与dash@rhubarbdog:echo不是bash内置程序,而是独立程序。但是有不同的实现方式;Linux通常有一个来自Coreutils包的,其他Unice有一个不同的。我可以重现这个问题(GNUMake 3.81)。在命令行上调用echo并重定向到文件时,echo工作正常;在makefile中调用以写入标准输出时,它可以正常工作;只有在makefile中调用并重定向到某个文件时,它才会失败。@lxg虽然有一个名为
echo
的独立程序,
bash
也将其作为一个内置命令来实现,以提高效率。(比较
类型echo
类型$(哪个echo)
)的输出。@chepner:Thx,不知道,-n是bash扩展,我认为它可以与dash@rhubarbdog:echo不是bash内置程序,而是独立程序。但是有不同的实现方式;Linux通常有一个来自Coreutils包的,其他Unice有一个不同的。我可以重现这个问题(GNUMake 3.81)。在命令行上调用echo并重定向到文件时,echo工作正常;在makefile中调用以写入标准输出时,它可以正常工作;只有在makefile中调用并重定向到某个文件时,它才会失败。@lxg虽然有一个名为
echo
的独立程序,
bash
也将其作为一个内置命令来实现,以提高效率。(将
type echo
的输出与
type$(哪个echo)
)进行比较。@chepner:Thx不知道这一点。只是一个问题,它可以工作,但是
printf
命令可以广泛使用和安装。我这么问是因为在至少7年的时间里,我从未真正听说过它,也从未见过它被使用过。如果有更好的方法将文本输出到文件中,那可能会更好;也许您的意思是“printf命令没有广泛使用和安装”?如果是这样,我向你保证那不是真的
printf
在1992年发布的第4版POSIX标准中添加。不管您是否听说过它,自从我遇到一个没有提供它的UNIX系统以来,已经很多很多年了。至于输出文本,
echo
可以输出文本。。。但对于输出,没有更好/更简单的选择