node first.js & node second.js
執行結果:
第一次:
first.js
second.js
第二次:
second.js
first.js
第三次:
first.js
second.js
第n次:
總結: 使用 & 連線符, first.js 和 second.js 的執行順序不確定。
node first.js && node second.js
執行結果:
第一次:
first.js
second.js
第二次:
first.js
second.js
第三次:
first.js
second.js
第n次:
總結: 使用 && 連線符, first.js 和 second.js 的執行順序與命令中指定的先後順序相同。
first.js
functionsecond.jsfirst()
module.exports = first();
functionpackage.jsonsecond()
module.exports = second();
,另一篇文章:"author": "",
"license": "isc"}
在bash
命令或npm script
中使用&
來實現併發
效果時,實際上是把&
左側的命令丟入後台執行,右側剩餘命令看做 整體 任務在前台執行,以此來實現併發效果。
而&&
是序列執行兩側命令,先執行完左側後再執行右側。
切記!!!
command1 & command2 && command3
並不是併發執行command1
和command2
後再執行command3
而是併發執行command1
和command2 && command3
最近,我組在遠端構建組內sdk
時踩了個坑!!!原先我們是ci
構建好sdk,推送到伺服器上,發現經常會出現推過去的zip
包檔案不全,或者檔案全了但是檔案的內容不全。很是神奇。
排查一番後發現,我們package.json
中的scripts
寫了個大概如下的命令
cross-env npm run build-core & npm run build-ui
並把這個命令用npm run build
代替。
嗯~看著沒問題,並行
的構建sdk-core
以及sdk-ui
。
構建好後就應該是打包,我們卻在ci
裡面寫了個「致命」的命令
npm run build && node publish.js
publish.js
就是我們用來發布到的指令碼檔案。看上去也是沒問題。。但是細想一下,整個命令就變成了這樣
cross-env npm run build-core & npm run build-ui && node publish.js
這裡就踩到了乙個坑!!!!
我們原來是想先並行的構建ui
與core
,完成後執行上傳指令碼。。但是這裡卻變成了並行
執行下面兩件事
1. 構建core
2. 構建ui和發布
這裡我們可以粗略地理解為&&
的優先順序更高所以導致了這種現象。
但其實是bash
中&
命令的特殊性導致的,前面我對「並行」做了特殊高亮,是因為表現上是並行的,但是&
命令的含義並不是並行的執行任務。
&
命令的真實含義是把左側的任務立即進入後台執行,這樣就是實現了&
兩側任務同時併發執行的效果,實際上會導致上面說的不符合期望的原因並不是因為優先順序問題,按我們的理解&
作為運算子的話優先順序是高於&&
的,之所以會造成上面的原因是因為命令按順序執行的話,&
使得左側任務瞬間進入後台執行,右側剩餘命令就看做乙個整體任務了。
code位址
準備好4個檔案index1.js
,index2.js
,index3.js
以及package.json
。
內容分別如下
index1.js
console.log('start index1');index2.jssettimeout(() =>, 6000);
console.log('start index2');index3.jssettimeout(() =>, 3000);
console.log('start index3');package.jsonsettimeout(() =>, 500);
}接著我們執行
npm test
。
神奇的事情發生了!!!
錯誤的理解上面的執行順序的話,期望結果應該是在index1
和index2
結束後才開始index3
,實際輸出否決了這個想法。
那把&
當做並行運算子而&&
的優先順序更高的話,結果應該是就是index3
是在index2
後開始,而index1
和index2
是並行開始,看上面的圖確實很像,但有個神奇的地方是,終端已經輸出done
了,退出了,過了一會才再次輸出end index1
!!
確實很神奇,但結合上面說的&
的原理就能理解。
先把index1
扔到後台執行,當前終端執行&
右邊的命令,跑完index2
後跑index3
,然後結束當前終端,此時在後台的index1
可能還沒執行完。這樣就造成了圖示現象。
centos 命令列中 和 的區別
錯誤 cp home test1 home test2 a 用引數 將不可以複製linux中.開頭的隱藏檔案 正確 cp home test1 home test2 a a引數,就等於 dpr 指令名稱 cp copy 功能介紹 將乙個檔案複製至另乙個檔案,或將數個檔案複製至另一目錄。語法格式 cp...
Java中 和 的區別
第十一,short s1 1 s1 s1 1 有什麼錯?short s1 1 s1 1 有什麼錯?引出一下討論。賦值運算子,在編譯器將右邊的表示式結果計算出來後,和左邊的變數型別比較精度,如果左邊的變數精度低於右邊的結果的精度,編譯器會顯式的報錯,告訴程式設計師去強制轉型。所以s1 s1 1出錯 最...
Linux shell中 和 的區別
shell中和的區別 結構比結構更加通用。這是乙個擴充套件的test命令,支援萬用字元。在 和 之間所有的字元都不會發生檔名擴充套件或者單詞分割,但是會發生引數擴充套件和命令替換。使用 條件判斷結構,而不是 能夠防止指令碼中的許多邏輯錯誤,比如,和 這些操作符能夠正常存在於這個條件判斷中,但是如果出...