2016-11-24 45 views
1

運行在我的標準OSX終端工作如下預期:NPM腳本命令失敗,使用過程中替換

$ diff <(ls dir1) <(ls dir2) 
correct output here 

但是當我嘗試運行它作爲一個NPM腳本,它將失敗:

$ npm run diff 
sh: -c: line 0: syntax error near unexpected token `(' 
sh: -c: line 0: `diff <(ls src) <(ls dist)' 

當我將NPM腳本更改爲"bash -c 'diff <(ls dir1) <(ls dir2)'"時,它首先輸出所需的結果,然後拋出錯誤(退出狀態1)。

編輯:那些奇怪的<()符號是process substitutions順便說一句。剛剛瞭解了他們。

+0

退出狀態可能是diff的退出狀態,如果文件或輸入不同,那麼它是1,所以不一定是錯誤? –

回答

3

爲背景信息補充Stefan Hegny's helpful answer

https://docs.npmjs.com/misc/scripts

腳本是通過將線作爲腳本參數sh運行。

如果腳本退出的代碼不是0,則會中止該過程。

具體來說,從package.json文件目標"scripts"項的內容傳遞給sh -c作爲參數,所以在命令行相當於你的命令是:

sh -c 'diff <(ls dir1) <(ls dir2)' 

將在失敗因爲當Bash被調用爲sh,在設計上它不識別process substitutions<(...),因爲它運行在POSIX兼容模式

過程替換不POSIX部分:它們是擊特定延伸(同時也支持zshksh)。

對於可移植性,你應該永遠只用POSIX-mandated shell features"scripts"條目 - 除非你明確地調用一個特定的外殼(如斯特凡的答案),直接或通過調用腳本文件其家當行指定外殼使用。

不同的shell在不同的平臺上充當sh,您可以依賴的唯一功能是那些由POSIX定義的功能。

而且注斯特凡的答案如何使用|| exit 0在bash命令結束,這樣才能確保整體命令始終報告退出代碼0,以確保npm不會中止處理。

+1

Kudos @ mklement0我其實對npm本人不瞭解。 –

2

嘗試

"bash -c 'diff <(ls dir1) <(ls dir2) || exit 0'"