2018年12月31日 星期一

GSM頻段

Source https://zh.wikipedia.org/wiki/GSM%E9%A2%91%E6%AE%B5

GSM頻段[編輯]

以下14個頻段由3GPP TS 45.005(繼承於3GPP TS 05.05)定義。
系統頻帶上行(MHz)下行 (MHz)信道編號對應UMTS/LTE頻段號
T-GSM-380380380.2–389.8390.2–399.8動態
T-GSM-410410410.2–419.8420.2–429.8動態
GSM-450450450.6–457.6460.6–467.6259–29331
GSM-480480479.0–486.0489.0–496.0306–340
GSM-710710698.2–716.2728.2–746.2動態12
GSM-750750747.2–762.2777.2–792.2438–511
T-GSM-810810806.2–821.2851.2–866.2動態27
GSM-850850824.2–849.2869.2–894.2128–2515
P-GSM-900900890.0–915.0935.0–960.01–124
E-GSM-900900880.0–915.0925.0–960.0975–1023, 0-1248
R-GSM-900900876.0–915.0921.0–960.0955–1023, 0-124
T-GSM-900900870.4–876.0915.4–921.0動態
DCS-180018001,710.2–1,784.81,805.2–1,879.8512–8853
PCS-190019001,850.2–1,909.81,930.2–1,989.8512–8102
  • P-GSM,基準GSM-900頻帶
  • E-GSM,擴展GSM-900頻帶(包括基準GSM-900頻帶)
  • R-GSM,鐵路GSM-900頻帶(包括基準和擴展GSM-900頻帶)
  • T-GSM,集群無線系統-GSM

GSM-900, GSM-1800 and EGSM/EGSM-900[編輯]

GSM-900和GSM-1800被用於世界上大部分區域:歐洲中東非洲大洋洲以及亞洲的大部分區域。南美洲和中美洲的以下國家使用:
  • GSM-900使用890–915MHz從裝置基站發送信息(上行),使用935–960MHz接收信息(下行),其提供124個無線頻道(頻道號1-124),每個頻道占用200kHz。雙工間隔是45MHz。100kHz的保護帶寬被置於頻段的兩端。[2]
  • GSM-1800使用1710–1785MHz從移動台向基站發送信息(上行),使用1805–1880MHz接收信息(下行), 其提供374個頻道(頻道號512-885)。 雙工間隔是95MHz。GSM-1800在英國也稱為DCS(數字行動電話服務),而在香港被稱為PCS[3]——為避免混淆,GSM-1900在世界上其他地區稱作PCS。MCA使用GSM1800。[4]

GSM-850和GSM-1900[編輯]

GSM-850和GSM-1900用於阿根廷巴西加拿大美國以及美洲的許多其他國家。

GSM-450[編輯]

另一種不太常見的GSM版本是GSM-450。[5]

參考資料[編輯]

  1. ^ 3GPP TS 05.05 version 8.20.0 Release 1999 Pages 9 and 10
  2. ^ Rappaport, Theodore S., Wireless Communications: Principles and Practices, 2nd Ed. Upper Saddle River, NJ: Prentice Hall, 2002. p. 554.
  3. ^ OFTA of HK, Office of the Telecommunications Authority 網際網路檔案館存檔,存檔日期2005-05-18.
  4. ^ http://europa.eu/rapid/pressReleasesAction.do?reference=MEMO/08/220&format=HTML&aged=1&language=EN&guiLanguage=en
  5. ^ Ericsson, Nokia Eye 450 MHz GSM technology

外部連結[編輯]

切換器類型與常見術語

Source http://www.ni.com/white-paper/3960/zht/

概觀

了解切換器的基本概念,包含極/投的常見命名方式、常開 (NO) 與常關 (NC) 術語、不同的切換拓撲、各種切換器類型等等,例如電磁式機械繼電器、簧片繼電器、場效電晶體 (FET) 切換器。 此線上教學屬於「儀器基本原理」系列的一部份。

目錄

  1. 命名方式
  2. 繼電器類型
  3. 簡介
  4. 額外的儀控資源

1. 命名方式

切換器是一種可以用來建立/中斷電路連結的裝置。 切換器又稱為繼電器。 雖然這 2 個詞彙經常互用,然而單一切換器通常稱為繼電器,而切換器則指多個繼電器的組合。

切換器可以是單一設計中的永久元件,也可做為用來測試機板的儀器。 切換器在做為儀器時,通常還具備額外的功能,例如可當做多功能數位電錶 (DMM)。 針對應用選擇切換器時,必須先了解不同類型的切換器。

極/投

一個切換器至少有 2 個端點:一個用來接收訊號,另一個則用來發送訊號。 切換器的「極」為輸入端點,用來定義切換器可控制的獨立切換器數量。 切換器的「投」為輸出端點,用來定義各個切換器的「極」可連接的輸出連結數量。 切換器主要按照極數與投數分類。
           
最簡單的切換器是單極單投 (SPST) 切換器。 正如名稱所示,此切換器可控制單一電路並連接單一輸出。 此切換器不是處於關閉狀態,便是完全中斷連結。 對於僅需開/關狀態的應用而言,SPST 不但相當實用,也是最常見的瞬間切換器。 瞬間切換器只有在致動時才處於關閉的狀態,例如在磁場中開關的按鈕或簧片切換器。

圖 1. SPST 切換器適用於僅需開/關狀態的應用,例如瞬間切換器。

單極雙投 (SPDT) 切換器可將單一輸入電路路由至 2 個輸出電路的其中之一。 此切換器可在 2 個選項中進行選擇,例如電源或 DMM。此切換器因可選擇 A 或 B 選項,所以又叫做 A/B 切換器,也稱為轉換切換器。 滑動切換器通常都是 SPDT。
圖 2. SPDT 切換器對於需要 2 個選項的切換器而言相當實用,例如滑動切換器。

雖然 SPDT 切換器具備雙投,可置放的位置卻不只 2 種。 SPDT 除了可連接至雙投之外,也可不要連接任何輸出,置於中間位置, 因此又叫做中心開放切換器。

雙極雙投 (DPDT) 切換器具備 2 個極,每個極皆有 2 個投。 此切換器一共有 6 個端點。 這個切換器有點像是透過單一致動器執行切換的 2 個 SPDT 切換器。 此切換器因可交錯連接端點,而經常用於相位或極性逆變。
圖 3. DPDT 切換器基本上就是 2 個可同時切換的 SPDT 切換器,經常用於相位或極性逆變。

SPST、SPDT 與 DPDT 切換器最為常見,不過您還是可以找到具備更多投/極的切換器。 例如旋轉切換器便具備多投。

常開、常關與切換形式

重新檢視圖 1 便會發現其中的 SPST 切換器即處於開路狀態。 此即所謂的常開 (NO) 切換器。 致動 NO 切換器後,便會關閉電路。 SPST NO 切換器又稱為 Form A 切換器,處於開路狀態時也可稱為 NO 接點。

另一種切換器則稱為常關 (NC) 切換器。 NC 切換器預設為通路狀態。 SPST NC 切換器又稱為 Form B 切換器,處於閉路狀態時也可稱為 NC。
圖 4. 切換器通常處於圖 1 的常開狀態,或如上圖所示處於常關狀態。

端點本身也可使用與上述相同的命名方式。 舉例而言,圖 2 中 SPDT 切換器上方的 1T 端點即可稱為 NC,而 2T 端點則可稱為 NO。DPDT 具備 2 個 NC 端點與 2 個 NO 端點。
圖 5. 可將個別端點命名為 NC 與 NO 端點。

SPDT 擁有 2 種主要形式。 Form C 切換器會先中斷原始連線再建立新連線,這種現象又稱為「先斷後合」(BBM)。 Form D 切換器則會同時接通新舊連線,再中斷原始連線;這可稱為「先合後斷」切換器。

圖 6. Form C 與 Form D 切換器又可分別稱為「先斷後合」、「先合後斷」切換器。

拓撲

切換器拓撲是一種組織結構,用以呈現切換器模組中的通道與繼電器。 通用拓撲切換器包含一組獨立的切換器或多個 SPST、SPDT 或 DPDT 切換器。 這些切換器在切換高電流負載時相當實用,例如功率與負載切換。

多工器 (mux) 是另一種形式的拓撲,您可以將多工器的單一輸入連接至多個輸出,或將單一輸出連接至多個輸入。 多工器的名稱通常以輸入數量 x 輸出數量表示。 舉例而言,使用 4:1 或 4 x 1 mux 即可將 4 個輸入連接至單一輸出。 如需使用示波器量測多個訊號,或是透過函式產生器將訊號連接至不同的點,此拓撲便相當實用。 根據您的應用需求,此拓撲可提供不同的切換形式。

圖 7. 您可以透過 mux 將多個輸入連接至單一輸出,也可將多個輸出連接至單一輸入,還可根據應用需求,提供不同的切換形式。

有了這種矩陣拓撲,便能夠將多個輸入連接至多個輸出,且組織結構呈行列形式。 您可以將任一行連接至任何數量的列,也能將任一列連接至任何數量的行。切換器就位於每個行列的交接處。 一旦切換器呈閉路狀態,列就會連接至行。 此拓撲雖然比其他拓撲更為複雜,卻能為應用帶來極佳的靈活彈性。

圖 8. 您可使用 2 x 4 矩陣切換,將多個輸入連接至多個輸出。


2. 繼電器類型

除了了解不同的切換器設定之外,還須了解不同類型的繼電器。

電磁式機械繼電器

電磁式機械繼電器是以電力操作的切換器,使用機械接點做為切換機制。 電磁式機械繼電器又稱為電樞繼電器。 此繼電器主要由線圈與接點所組成。 線圈通電後會產生磁場並推動電樞,進而開啟或關閉接點。

圖 9. 電磁式機械繼電器是以電力操作的切換器,使用機械接點做為切換機制。

電磁式機械繼電器支援多種訊號特性,諸如低電壓/電流、高電壓/電流、DC 與 GHz 頻率等。 因此您可輕易找到訊號特性符合系統需求的電磁式機械繼電器。

不過,電磁式機械繼電器上的接點通常都比其他繼電器大,也更為堅固耐用。 由於電磁式機械繼電器的接點較大,因此更能承受電路或接線中寄生電容意外產生的浪湧電流。 然而,接點較大,就代表整個組合的體積也變大了,因此無法密集安裝在切換器模組上。

雖然電磁式機械繼電器的機械構造有助於提高切換彈性,但這種切換器卻有個重大弱點:速度有限。 電磁式機械繼電器的速度比其他繼電器慢,切換與穩定時間大概是 5 ~ 15 毫秒。對某些應用來說,這樣的運作速度可能太慢了。

電磁式機械繼電器的機械壽命通常比其他繼電器短, 隨著技術不斷提升,電磁式機械繼電器的機械壽命也更長了,但致動效能還是不能與同級的簧片繼電器相提並論。電磁式機械繼電器與其他繼電器一樣,整體的使用壽命很容易受到功率切換量與其他系統考量所影響。實際上,電磁式機械繼電器的機械壽命可能不及簧片繼電器,但就電子使用壽命而言,此繼電器在相同的負載下 (尤其是電容性負載) 通常比較不易衰退。相較於同級的簧片繼電器,電磁式機械繼電器的接點更大、更堅固、也更耐用。

電磁式機械繼電器分為鎖存式 (latching) 與非鎖存式 (non-latching) 兩種。 致動之後,鎖存式繼電器仍會維持原本的狀態。 鎖存式繼電器並無預設位置,在驅動電流停止之後,將停留在最後的位置。 鎖存式繼電器具備內部磁鐵,能在電流開始流動之後固定繼電器,藉此降低耗電量,這是因為致動之後,繼電器不需電流就能維持不動。 因此,鎖存式繼電器非常適用於必須限制耗電與散熱的應用。 由於線圈不會因發熱而產生熱電動勢 (EMF) 並影響量測結果,因此超低電壓應用大多使用鎖存式繼電器。

鎖存式繼電器可能具備 1 或 2 個線圈。 單線圈鎖存式繼電器的電流方向決定了電樞的位置。 雙線圈鎖存式繼電器則是由電流通過的線圈來決定電樞的位置。

圖 10. 鎖存式線圈在致動後維持不動。 單線圈鎖存式繼電器的電流方向決定了電樞的位置。 雙線圈鎖存式繼電器的電樞位置則是由電流通過的線圈決定。

相較之下,非鎖存式繼電器只有在致動時才會維持原本的狀態。
在無電流通過的情況下,簧片或永久磁鐵的作用力會把非鎖存式繼電器固定在最初的位置上。 當電流通過線圈的時候,磁場的磁力將固定於 NO 接點。 電流停止時,繼電器又會回到原先的 NC 位置。 對於部分控制應用而言,切換器必須在電力中斷時回到已知狀態,在這個情況下,非鎖存式電磁式機械繼電器便相當實用。 此繼電器經常用於按鈕應用,例如鍵盤或微控制器輸入按鈕。

圖 11. 非鎖存式繼電器只有在致動時才會維持原本的狀態。對於部分控制應用而言,切換器必須在電力中斷時回到已知狀態,在這個情況下,非鎖存式電磁式機械繼電器便相當實用。

簧片繼電器

簧片繼電器使用電磁鐵控制一或多組簧片切換器。 雖然簧片繼電器與電磁式機械繼電器都配備實體接點,並可使用機械啟動的方式來開啟或關閉路徑,但簧片繼電器的接點尺寸遠小於電磁式機械繼電器,而數量也相對較少。乾式簧片繼電器由圍繞著簧片切換器的線圈所組成, 簧片切換器包含 2 片密封於玻璃或陶瓷管中的強磁性葉片 (稱為簧片),管內充滿惰性氣體。簧片的重疊端上有接點,當線圈通電時,2 片簧片會受到牽引,使接點互相接觸,並在繼電器上形成通路。 一旦線圈停止通電,簧片的彈力就會分開接點。

由於簧片繼電器的移動式零件相當輕巧,因此切換速度比電樞繼電器更快,消耗的電力也較少。 然而,簧片繼電器卻較容易被電弧損壞。 電弧火花在各接點間跳動時,往往會造成一小部分的簧片熔化; 如果接點熔化的部分在關閉狀態時重新凝固,接點就可能會焊接在一起。 簧片的彈力通常不足以斷開焊接,導致簧片在開路狀態時相黏。

圖 12. 簧片繼電器的電流通過線圈時會產生磁場,進而牽引 2 片簧片並使接點互相接觸。

由於簧片繼電器的接點較小、數量較少且啟動機制不同,因此切換速度是同級電磁式機械繼電器的 10 倍之多。 簧片繼電器的機械使用壽命也比電磁式機械繼電器更長。 但缺點是接點面積較小,比較容易在關閉電路時被電弧損壞。電弧在各接點間跳動時,往往會造成一小部分的接點表面熔化, 如果接點熔化的部分在關閉狀態時重新凝固,接點就可能會焊接在一起。 驅動電流關閉後,簧片的彈力通常不足以斷開焊接,導致繼電器無法使用。 雖然電磁式機械繼電器也可能因電弧而受損,但電力要夠大才有可能造成損害。

由於簧片繼電器非常容易發生接點損壞,因此必須特別留意系統電容產成的浪湧電流 (Inrush Current)。繼電器與電容之間的串聯阻抗 (如電阻或磁體) 可以控制浪湧電流。無論此電流是來自無功 (Reactive) 待測裝置或抗雜式連接線,系統中的任何電容都可能產生浪湧電流。

簧片繼電器採用強磁性材質,比同級的電磁式機械繼電器更容易產生嚴重的 EMF,並引發過多雜訊且造成量測結果出錯,因此不適合超低電壓應用。

簧片繼電器的尺寸較小且速度極快,非常適合多種切換應用。 簧片繼電器多半用於矩陣與多工器模組中,通用模組較少使用簧片繼電器。

固態繼電器

固態繼電器 (SSR) 是一種電子切換器,會在小型外部電壓輸入端點時致動。 SSR 具備能夠回應輸入的感測器、可將電力切換至負載電路的固態電子切換裝置,並具備偶合機制,不需機械零件即可啟動控制訊號。
SSR 使用配備 LED 的光感應金屬氧化半導體場效電晶體 (MOSFET) 裝置來啟動裝置。

圖 13. 就 SSR 而言,LED 所發出的光線將啟動光感應 MOSFET,並讓電流通過。

由於切換時間視開關 LED 電源的時間長短而定 (一般約為 1 ms 與 0.5 ms),因此其切換速度高於電磁式機械繼電器。 SSR 沒有機械零件,因此使用壽命較機電繼電器或簧片繼電器高。 這項特色也讓 SSR 比較不受物理振動影響。 不過 SSR 和電磁式機械繼電器與簧片繼電器不同,SSR 主要使用電晶體而非實體金屬建立連結,因此接觸電阻較高。 雖然 SSR 的接觸電阻已因技術進步而獲得持續改善,然而目前製程中電阻超過 100 Ohm 的繼電器仍然相當普遍。

SSR 產生的雜訊較低,但卻沒有電磁式機械繼電器那樣穩定。如果使用時的訊號準位超過標準,SSR 往往會像簧片繼電器一樣因浪湧電流而損壞。 雖然 SSR 並沒有會熔化的金屬接點,但 MOSFET 一旦遭到破壞,繼電器也就無法使用了。

最後,SSR 的價格通常比其他切換器更高, 散發的熱能也較多。 SSR 適合高電壓應用並常見於矩陣與多工器。

FET 切換器

FET 切換器使用一系列 CMOS 電晶體建置切換功能, 將電壓供應至連接電晶體網路 (負載電路) 源極與汲極的控制電路。
圖 14. 控制電路將直接驅動 FET 切換器的電晶體閘極,藉此提升低電壓訊號的切換速度。

FET 切換器和 SSR 一樣,都不是機械裝置。與 SSR 不同,FET 切換器的控制電路不需驅動 LED,即可直接驅動電晶體閘極。 由於開啟/關閉 LED 的時間不會構成問題,因此直接驅動電晶體閘極可達到更快的切換速度。本文介紹的切換器中,FET 切換器的速度最快。由於封裝中並不包含機器零件或 LED,因此 FET 切換器可擁有極小的尺寸。 FET 切換器的主要限制是缺乏實體的隔離障礙,因此僅能搭配使用低電壓訊號。

由於同為 FET 架構,因此這款切換器的優缺點均與 SSR 相似。 舉例來說,FET 切換器的不僅使用壽命極長,路徑電阻也遠高於電磁式機械繼電器或簧片繼電器。

FET 切換器適合更高速的低電壓應用,並常見於多工器設定。

整體而言,電磁式機械繼電器是相當良好的通用式解決方案,然而封裝尺寸、切換速度與機械壽命均受到限制。簧片繼電器的封裝尺寸、密度與速度均有所改善,但因可能產生浪湧電流,耐用度較差。 SSR 雖可替代機械繼電器,但卻會產生較高的路徑電阻。 FET 切換器則為高速、低成本的解決方案,但只能用於低電壓應用中。



3. 簡介

  • 切換器是一種可以用來建立/中斷電路連結的裝置。
  • SPST 切換器可控制單一電路,並連接單一輸出, 適用於僅需開關狀態的應用。
  • SPDT 切換器可將單一輸入電路路由至 2 個輸出電路的其中之一, 適合在 2 個選項中進行選擇。
  • DPDT 切換器就如同透過單一致動器執行切換的 2 個 SPDT 切換器。 此切換器因可交錯連接端點,而經常用於相位或極性逆變。
  • 電磁式機械繼電器是以電力操作的切換器,使用機械接點做為切換機制。 電磁式機械繼電器是相當良好的通用式解決方案,然而封裝尺寸、切換速度與機械壽命均受到限制。
  • 鎖存式繼電器在致動之後,仍會維持原本的狀態。
  • 非鎖存式繼電器只有在致動時才會維持原本的狀態。
  • 簧片繼電器使用電磁鐵控制一或多組簧片切換器。 簧片繼電器的封裝尺寸、密度與速度均有所改善,但因可能產生浪湧電流,耐用度較差。
  • 通用拓撲切換器包含一組獨立的切換器或多個 SPST、SPDT 或 DPDT 切換器。 這些切換器在高電流負載時相當實用,例如功率與負載切換。
  • 多工器 (mux) 是另一種形式的拓撲。您可以將多工器的單一輸入連接至多個輸出,或將單一輸出連接至多個輸入。
  • 有了這種矩陣拓撲,便能夠將多個輸入連接至多個輸出,且組織結構呈行列形式。
  • 固態繼電器 (SSR) 是一種電子切換器,會在小型外部電壓輸入端點時致動。 SSR 雖可替代機械繼電器,但卻會產生較高的路徑電阻。
  • FET 切換器使用一系列 CMOS 電晶體建置切換功能, FET 切換器為高速、低成本的解決方案,但只能用於低電壓應用。


4. 額外的儀控資源

深入了解多合一儀器在單一裝置上所提供的功能,例如混合式訊號示波器、函式產生器、多功能數位電錶、可程式化 DC 電源供應器與數位 I/O,另外還可整合 PC 或 iPad,提升電路設計的除錯與檢驗效率。

測試用切換器
不論是要在多個測試點執行高精度或慢速量測,或是積體電路的高通道數、高頻率特性參數描述作業,均可進一步了解 PXI 或 SCXI 架構的模組化切換解決方案,此方案可大幅提升設備再使用率、測試輸出率與系統可調整性。

如需要完整的線上教學,可回到儀器基本原理的首頁。

static vs. dynamic UBI volume

Source http://lists.infradead.org/pipermail/linux-mtd/2010-February/028905.html

Artem Bityutskiy dedekind1 at gmail.com Tue Feb 2 01:20:37 EST 2010

On Tue, 2010-01-19 at 09:41 -0500, twebb wrote:
> Can a UBI volume be declared vol_type=static, but mounted with "ro"?

Yes. Static volumes are not writable, so this is the only way they can
be mounted.

> Conversely, if a volume is declared vol_type=dynamic, is it acceptable
> to mount "ro" or "rw"?

Yes. Dynamic volumes are writable, so you can choose R/O or R/W.

> I'm seeing a very occasional problem on a volume that is
> vol_type=dynamic, and is mounted "rw" during startup, then finally
> "ro".

If UBIFS switches to R/O mode, this means there is some problem, e.g.,
there are unexpected corruptions, etc. Switching to R/O mode is a
defensive measure.

>   The ubiattach works fine, but when trying to initially mount
> (as "rw"), I've seen...
> 
> [   12.887251] UBI error: ubi_io_read: error -74 while reading 516096
> bytes from PEB 4:8192, read 516096 bytes

-74 is -EBADMSG. It is returned by the MTD driver and should mean that
the driver found an unrecoverable ECC error.

UBIFS is reading whole LEB. MTD returns -EBADMSG. So somewhere in these
516096 bytes of data an unrecoverable ECC error happened.

But UBIFS does not give up. It's logic is that "I have everything
protected by CRC32, if there are problems, I'll detect them". So UBIFS
continues.

> [   12.897619] UBIFS error (pid 1): ubifs_scan: corrupt empty space at
> LEB 2:268135

So UBIFS continues. I probably finds valid nodes, or may be not. Anyway,
UBIFS sees that 0xFF bytes, and concludes the rest of the LEB should
contain only 0xFFs, i.e., empty space.

However, at offset 268135 UBIFS findes non-0xFFs, which is invalid.

If you followed my instructions here:

http://www.linux-mtd.infradead.org/doc/ubifs.html#L_how_send_bugreport

You would have hexdump of the data and we could see what is in the
buffer. It could help.

> [   12.905060] UBIFS error (pid 1): ubifs_scanned_corruption:
> corruption at LEB 2:268135
> [   12.922940] UBIFS error (pid 1): ubifs_scan: LEB 2 scanning failed
> [   13.048269] UBI error: ubi_io_read: error -74 while reading 516096
> bytes from PEB 4:8192, read 516096 bytes
> [   13.058549] UBIFS error (pid 1): ubifs_recover_master_node: failed
> to recover master node

And UBIFS does not know how to proceed with that.

> Not sure if this is corruption within NAND or something else.

May be something specific to MLC. May be a bug in the NAND driver. May
be a bug in UBIFS. May be you made some mistake at some point, dunno.

Is this reproducible?

-- 
Best Regards,
Artem Bityutskiy (Артём Битюцкий)

Switching between Java Versions on Ubuntu linux

Source https://aboullaite.me/switching-between-java-versions-on-ubuntu-linux/

If you're using Ubuntu Linux on your daily basis work, you've probably Java installed on your machine. Personally I prefer using Wepupd8 PPA to manage JAVA installation, it makes my life a lot more easier especially for updates. The Wepupd8 team didn’t add any binary for Oracle JAVA installation and they made a script to download the Oracle JAVA from Oracle website and install it straight away. So whenever Oracle will release the update, I can simple upgrade via package manager.
Working with multiple Java versions in your machine is a normal thing, especially if you're a Java developer, and because I'm a (very) lazy person, I'm always looking for a quicker/easier way to make the switch.
Today, I'll share with you my tip on this subject. First, let's run the following command:
$ sudo update-alternatives --config java
Running this command shows a list of installed Java JDKs and JREs allowing one to be selected as the default that is used when java needs to be executed.
There are 5 choices for the alternative java (providing /usr/bin/java).
Selection    Path                                            Priority   Status
------------------------------------------------------------
* 0            /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java   1081      auto mode
  1            /usr/lib/jvm/java-6-oracle/jre/bin/java          1         manual mode
  2            /usr/lib/jvm/java-7-oracle/jre/bin/java          2         manual mode
  3            /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java   1081      manual mode
  4            /usr/lib/jvm/java-8-oracle/jre/bin/java          3         manual mode
  5            /usr/lib/jvm/java-9-oracle/bin/java              4         manual mode

Press  to keep the current choice[*], or type selection number:
1234567891011
But I'm using it just to get the Installation path of each Java version.
Then, for each version I created a script that contain the following lines (in the example below, I'm showing the one for java 8):
sudo update-java-alternatives -s java-8-oracle
export JAVA_HOME=/usr/lib/jvm/java-8-oracle/
export PATH=$PATH:$JAVA_HOME
123
Note that I'm using u8.sh to make he switch to Java 8, and u9.sh for Java 9 and so on.
The final step is to add an alias in ~/.bashrc file to source our script as follow:
...
# Alias
alias u7='source /home/aboullaite/Utils/Java/u7.sh'
alias u8='source /home/aboullaite/Utils/Java/u8.sh'
alias u9='source /home/aboullaite/Utils/Java/u9.sh'
12345
and That's all. Now for switching between Java versions, I only run u8, u7 or u9 ;)

重新導向 (2>&1)

To redirect both stdout and stderr to a truncated file, I know to use:
cmd &> file.txt

cmd >>file.txt 2>&1
Bash executes the redirects from left to right as follows:
  1. >>file.txt: Open file.txt in append mode and redirect stdout there.
  2. 2>&1: Redirect stderr to "where stdout is currently going". In this case, that is a file opened in append mode. In other words, the &1 reuses the file descriptor which stdout currently uses.

Source http://ibookmen.blogspot.com/2010/11/unix-2.html

這幾天因為研究 L4D2 的專屬伺服器架設,看到 Srcds 網站針對確保 Srcds 服務程序能隨時保持高優先權,在 crontab 底下使用 renice 的方式每五分鐘調整一次程式的優先權,其指令中
renice -20 `cat /home/yoursrcdspath/srcds.pid` >/dev/null 2>&1

最後面的「>/dev/null 2>&1」為 Unix 的重新導向技巧。雖然大約知道是什麼,不過實際上的原理我卻一直不明白,大約查了一下,疑問變更多。於是我決定來搞清楚它的來龍去脈,這篇文章就是這樣來的。

首先,我們先說明一下這段語法的作用,「>/dev/null 2>&1」實際上在這裡會將左邊程式的執行結果丟給「/dev/null」,然後不管程式有什麼錯誤,也會一併丟給 null。熟悉 Unix 的人大概知道,「/dev/null」是 Unix 底下的垃圾筒+黑洞。它不帶任何意義,所有丟進去的東西都會被吃掉然後不見,反正你不想看到的東西丟給 null 就對了。而「>」的意思其實是,將「>」左邊輸出的東西重新導向到右邊去。但不止是這樣而已,系統將標準輸入輸出分成三個:標準輸入 (stdin)、標準輸出 (stdout)、以及標準錯誤輸出 (stderr),它們的 fd (file descriptor, 檔案描述子) 分別是 0、1、2。當「>」左邊未指定任何東西時,它會讀取左方程式的標準輸出 (也就是 fd=1) 重新導向給右邊的東西,但是你也可以指定要重新導向的 fd (也就是說「>abc.txt」會等於「1>abc.txt」)。所以可以想見 2>&1 的意思應該是把 fd=2,也就是標準錯誤輸出重新導向給 &1。而這邊的 &1 指的其實就是 fd=1。這邊似乎有點混淆視聽的感覺,為什麼「>」前面的 fd 不需要指定 &,後面的 fd 卻又要加 & 呢?我沒找到確切的原因,但是根據這篇討論,我認為有可能是因為「>」左邊只接受 fd,但右邊所接收的語法卻應該是檔案名稱。因此若用「2>1」其結果會變成「將標準錯誤輸出重新導向給檔案名稱為 "1" 的檔案」,所以我們需要用 & 來告訴系統後面的 "1" 指的是 fd。

接下來,有趣的東西來了。根據「man bash」裡 REDIRECTION 段落裡的說明,重新導向的順序是由左至右。也就是說「>/dev/null 2>&1」會先處理「>/dev/null」再處理「2>&1」。如果聽到這裡你覺得怪的話,再告訴你一件很幹的事。用「2>&1 >/dev/null」並不會將 stderr 導到 /dev/null。「man bash」裡的說明如下:
Note that the order of redirections is significant. For example, the
command

ls > dirlist 2>&1

directs both standard output and standard error to the file dirlist,
while the command

ls 2>&1 > dirlist

directs only the standard output to file dirlist, because the standard
error was duplicated as standard output before the standard output was
redirected to dirlist.

我看到這段的時候重複讀了好幾遍,確定我他媽的沒誤解原文的意思。「ls > dirlist 2>&1」的 stdout 不是先被導到 dirlist 去了嗎?後面再把 stderr 導到 stdout 也會輸出到 dirlist 去,這感覺上像是前面 stdout 的導向到後面仍然有作用。但是「ls 2>&1 > dirlist」先把 stderr 導到 stdout 之後,後面再把 stdout 導向 dirlist,這時 stderr 卻不會跟著被導過去。我對於這點相當困惑,於是在網路上找了一下。發現這篇文章,裡面的回答提到,在對 stdout 做導向時,系統所做的事大約會是這樣:
close(1);
fd=open("results.txt", O_WRONLY, 0);

系統必需先把原本已經打開的 fd=1 關閉,然後再將要導入的檔案開啟,新開啟的檔案就會被指定為 fd=1。這時候再遇到後面 stderr 的導向時,系統會這麼做:
close(2);
fd=dup(1);

一樣是先把 fd=2 關閉,但是這時候要導向的是另一個 fd,所以基本上系統做的事情只是把 stdout 的 fd 複製一份給 stderr。由於 fd 是指向相同的地方,所以這時任何寫入 stderr 的資料當然也會進入已經開啟的 dirlist 裡。那麼倒過來為什麼不行?因為倒過來的話我們會先把 stderr 指向 stdout,但是當 stdout 被導向 dirlist 時會捨棄舊的 fd=1,開啟 dirlist 為新的 fd。這時 stderr 指向的卻還是舊的 stdout 的 fd,因此並不會寫入 dirlist。

由以上看來,系統在做導向的時候會依序把要導入的檔案打開 (若為 fd 則直接複製該 fd),導向完成後才會開始執行程式的輸出。這點完全符合 REDIRECTION 這段的第一句話:
Before a command is executed, its input and output may be redirected using a special notation interpreted by the shell.

重新導向是 Unix 系統上很有力的一個工具,和 pipeline 結合使用可以使得下指令變得很靈活。但是要進行較複雜的運用時就必須更深入了解其中的原理,否則很容易就會出錯了。