我有一个包含这种命令的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。
答案 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(包括bash
和zsh
)也有一个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