我怎样才能从npm脚本pipe道到bash别名?
我有一个别名在我的.bashrc为bunyan:
$ alias bsh alias bsh='bunyan -o short'
这行在bash中运行正常:
$ coffee src/index.coffee | bsh
但是如果我把同样的东西放在'脚本'
"scripts": { "test": "echo \"Error: no test specified\" && exit 1", "coffee":"coffee src/index.coffee | bsh" },
和npm run coffee
,它失败了:
> coffee src/index.coffee | bsh sh: bsh: command not found events.js:141 throw er; // Unhandled 'error' event ^ Error: write EPIPE at exports._errnoException (util.js:870:11) at WriteWrap.afterWrite (net.js:769:14)
所以随便我试着把||
而不是|
它的工作。 我不明白为什么。 就我所知,我不必在JSON中转义pipe道字符。
但是,它实际上不会将输出pipe道输送到bsh别名。
实际的解决方法是使用"coffee":"coffee src/index.coffee | bunyan -o short"
– 彻底摆脱别名。
如何在npm脚本中使用bash别名?
你可以创build一个函数而不是别名。
function bsh() { bunyan -o short } export -f bsh
导出将使其可用于subprocess。
所以我有一个完整的回应打印使用
. ~/.bash_aliases && coffee src/index.coffee | bsh
但事实certificate,别名几乎没有,如果有的话,在bash脚本支持。 从我所读到的,别名被弃用,有利于function…
看到这个讨论什么说服我使用function,而不是别名。 我尝试了一两个小时,通过使用/ bin / bash -c以及npm运行来testing别名,没有运气。 然而,使用迭戈build议的function立即工作,没有问题。
即使这个问题已经被标记为回答,以防某些人像我一样固执地从谷歌那里转移,并决定尝试使别名工作,而不是仅仅使用一个函数。
不过,当我尝试在npm脚本中使用这个function时,我遇到了一个问题。 即使使用export -f,我的函数也无法识别 – 我仍然必须手动包含bash_aliases文件,即使如此,我也得到了有关导出的-f选项的错误。
为了实际得到这个工作,我不得不拿出function出口线,并手动包括bash_aliases文件…