跳轉到內容

下一代測序 (NGS)/生物資訊學從外部

來自華夏公益教科書
下一代測序 (NGS)
大資料 生物資訊學從外部 預處理

生物資訊學從外部

[編輯 | 編輯原始碼]
要深入瞭解 UNIX,請參閱 UNIX 指南UNIX 快速入門

Unix 命令列:歷史

[編輯 | 編輯原始碼]

第一個版本的 Unix 由貝爾實驗室(AT&T 的一部分)於 1969 年開發,距今已有 40 多年的歷史。它的起源可以追溯到計算機體積龐大、數量稀少、使用時間非常昂貴並且在許多使用者之間共享的時代。Unix 的開發是為了允許多個使用者同時工作。Unix 實際上是出於玩一個名為 太空旅行 的遊戲的願望而產生的,而使其成為作業系統的特性則是偶然的。最初,它只支援一個使用者,Unix 的名稱(最初為 UNICS)是 MULTICS 的一個雙關語,MULTICS 是當時可用的一個多使用者系統。

雖然這在每個人都有自己筆記型電腦的世界中似乎很奇怪且不必要,但計算正在重新回到遠端中央服務,許多使用者共享。對映下一代測序資料或從頭組裝所需的計算能力超出了您筆記型電腦上可用或可取的範圍。在許多方面,“雲”(或者在你閱讀本文時取代它的任何東西)需要以與傳統 Unix 機器更相似的​​方式工作,而不是 Windows 和 Apple Macintosh 所強調的個人計算方式。

美國聯邦壟斷法阻止 AT&T 將 Unix 商業化,但在貝爾實驗室以外使用 Unix 的興趣不斷增加,最終他們決定免費提供 Unix,包括原始碼,這允許其他機構對其進行修改。也許其中最重要的是伯克利大學。(Mac OS X 的很大一部分根植於伯克利標準發行版(BSD),它分發了工具集以使 Unix 更實用,並進行了重大改進以顯著提高效能。)幾所大學參與其開發意味著 Unix 在網際網路誕生時處於理想位置,並且許多基本技術是在 Unix 機器上開發和測試的。同樣,這些改進也是免費提供的。一些程式碼被重新用於為早期版本的 Windows 提供網路連線,即使在今天,Windows Vista 中的幾個實用程式也包含了伯克利程式碼。

除了在早期網際網路的發展中發揮關鍵作用外,Unix 機器也是第一臺網路伺服器,一臺 NeXT cube。NeXT 是早期嘗試將 Unix 機器用於桌面使用的嘗試。它在當時非常先進,但也很昂貴,除了金融行業之外,它從未真正流行起來。蘋果最終收購了 NeXT,其作業系統變成了 OS X,這種遺產仍然可以在其程式設計介面中看到。蘋果現在是 Unix 機器最大的製造商;每臺蘋果電腦、iPhone 和大多數最新的 iPod 在其外觀之下都擁有一個 Unix 基礎。

到 90 年代初,Unix 變得越來越具有商業重要性。這不可避免地導致了法律糾紛:由於這麼多人免費贈送改進並將其整合到系統中,那麼究竟是誰擁有它?法律糾紛給免費提供的 Unix 版本蒙上了一層陰影,為另一種免費作業系統創造了機會。

這個空白由 Linux 填補,Linux 是由 Linus Torvalds 於 1991 年作為愛好開始的,類似於 Unix 的免費提供的計算機作業系統。更準確地說,Linux 只是核心,它是所有其他程式執行的中心程式。要製作一個作業系統,還需要更多工具。這些工具由 GNU 專案提供。[1]

重要的是,Linux 是從頭開始編寫的,不包含任何原始的 Unix 程式碼,因此不存在法律疑慮。與網際網路滲透大學校園以及廉價但功能強大的個人電腦的普及相吻合,Linux 在兩年內迅速成熟,超過 100 名開發人員透過網際網路進行合作。推動 Linux 發展的真正進步是社會性的,而不是技術性的,分散的志願者在這樣的理解下貢獻時間:作為回報他們免費提供自己的工作,任何基於他們工作的內容也是免費提供的,因此他們反過來也從改進中受益。

支撐這種共享並確保沒有人可以在不共享的情況下從其他人的工作中獲利的理念是“版權所有”,這在稱為 GNU 通用公共許可證的簡單法律檔案中有所描述,[2] 它顛覆了版權的概念。(需要注意的是,GNU 專案及其背後的理念早於 Linux 將近十年。)如今,Linux 已成為占主導地位的免費類 Unix 作業系統,擁有數百萬使用者和許多大型公司的支援。

獲取和安裝 Ubuntu

[編輯 | 編輯原始碼]

這裡我們描述 Ubuntu 發行版(打包)的 Linux,它是使用最廣泛的發行版之一,但所有示例都相當通用,應該適用於大多數 Linux、Unix 和 Mac OS X 計算機。網上有很多關於如何安裝 Ubuntu 的指南,但我們建議您在當前計算機上將其安裝為虛擬機器。

Ubuntu Linux 發行版通常易於使用,並且每六個月都會更新(免費)。這裡使用的示例和版本適用於 Ubuntu 11.10 版本,以 2011 年 10 月的釋出日期命名,也稱為“Oneiric Ocelot”;下一個(最新的)版本 12.04 或“Precise Pangolin”於 2012 年 4 月釋出,被指定為長期支援 (LTS) 版本,這意味著它將在退役之前接受修復和維護升級五年,如果您不想定期升級系統,它是最佳選擇。

Ubuntu 經過精心設計,使用起來非常便捷,即使是計算機新手也能夠輕鬆上手。對於剛接觸 Ubuntu 的使用者,網上有很多教程可以參考。官方文件可以在[3]找到,但只需在網上快速搜尋就可以找到更多內容。此外,機器上還安裝了許多文件。可以透過將滑鼠移動到螢幕左上角的 Ubuntu 桌面,並點擊出現的幫助選單來訪問這些文件。一般來說,你正在使用的程式名稱會顯示在螢幕左上角,將滑鼠移動到螢幕頂部會以類似於 Mac 上顯示的方式顯示程式選單(雖然令人困惑的是,一些程式將其選單顯示在自己的視窗中,就像 Windows 計算機一樣)。

另一種獲取幫助的方法是點選螢幕左上角的圓形符號(三個手拉手的人的藝術化圖片),並在出現的搜尋框中鍵入“help”。為了便於稱呼,我們將“手拉手”按鈕稱為 Ubuntu 按鈕,儘管出現的幫助文字將其描述為“Dash home”。

Ubuntu 附帶許多免費工具,包括網頁瀏覽器、檔案管理器、文字處理器等。大多數日常使用的軟體都有免費的替代品,可以透過點選 Ubuntu 軟體中心來瀏覽它們,該中心的螢幕左側圖示看起來像一個裝滿了商品的紙購物袋。Ubuntu 軟體中心只是一個起點,還有許多其他來源,包括專門為 Ubuntu 打包的預打包軟體和需要編譯的原始碼。在網上搜索“Ubuntu 軟體庫”以獲取有關獲取更多軟體的更多資訊。

雖然與 Windows 或 Mac 一樣,Ubuntu 也有一些明確的組合鍵用於複製和貼上文字(control-c 和 control-v),但並非所有程式都遵守這一約定。傳統上,Unix 更偏向於滑鼠操作,使用左鍵選擇文字,使用中鍵複製文字。如果你不習慣使用滑鼠中鍵,你可能會偶爾意外地這樣做。從圖示啟動應用程式、開啟資料夾等... 只需要單擊一次,而不是 Windows 所需的雙擊,這使得按下按鈕和從選單中選擇專案的操作更加一致。意外雙擊通常會導致某個操作執行兩次,這通常不是什麼壞事,但這意味著性急的使用者可能會很快發現他們的桌面被視窗覆蓋。

也許你每天都會遇到的最重要的區別是,檔名和目錄名是區分大小寫的:README.txt、readme.txt 和 readme.TXT 代表不同的檔案。這與 Windows 和 Mac OS X 不同,在 Windows 和 Mac OS X 中,大小寫字元保留在名稱中,但檔案可以使用任何大小寫來引用。(儘管 OS X 繼承了 Unix 的傳統,但蘋果公司選擇這種行為是為了與早期版本的 Mac 作業系統保持相容)

獲取示例

[編輯 | 編輯原始碼]

本教程中有很多示例可以嘗試,它們包含在類似於以下示例的方框中,這些方框解釋了示例的格式。下面的示例展示瞭如何自動下載並解壓縮檔案以供使用。

圖 1:自動下載並解壓縮檔案的示例

基礎知識

[編輯 | 編輯原始碼]
命令列
[編輯 | 編輯原始碼]

雖然 Ubuntu 擁有現代作業系統中所有你可能期望的圖形工具,因此新使用者很少需要處理其 Unix 基礎,但我們將使用命令列。一個顯而易見的問題是,為什麼命令列仍然是與 Unix 互動的主要方式,或者更確切地說,為什麼我們要讓你使用它?第一個問題的部分答案是,Unix 的起源早於圖形介面的發展,這就是所有工具和程式的演變來源。命令列之所以仍然流行,是因為它是與計算機互動的一種非常有效的方式:當你想要做一些足夠複雜的事情,而沒有一個方便的按鈕可以實現時,圖形介面會迫使你瀏覽許多選單並手動執行一項可以自動化的任務。或者,你必須訴諸某種形式的程式設計(Mac OS X Automator、Microsoft Office 宏等),這在功能上等同於使用命令列。

Unix 是圍繞許多旨在協同工作的微型工具構建的。每個程式都執行一項任務,並以其他程式易於理解的格式返回其輸出。這些特性允許將簡單的程式組合在一起以產生複雜的結果,就像用樂高積木搭建東西一樣。1978 年貝爾系統技術期刊[4]中的前言將 Unix 哲學描述為

"(i) 讓每個程式都做好一件事。要完成一項新工作,就要從頭開始構建,而不是透過新增新功能來使舊程式變得複雜。

(ii) 預期每個程式的輸出將成為另一個程式的輸入,而這個程式尚不清楚。不要在輸出中加入無關的資訊。避免使用嚴格的列式或二進位制輸入格式。不要堅持互動式輸入。

(iii) 設計和構建軟體,即使是作業系統,也要儘早嘗試,理想情況下在幾周內完成。不要猶豫,將笨拙的部分扔掉並重新構建它們。

(iv) 使用工具而不是非熟練的幫助來減輕程式設計任務,即使你必須繞道構建工具,並期望在完成使用後將其中一些工具扔掉."

本教程的其餘部分將基於透過“終端”使用命令列。這個術語可以追溯到 Unix 的早期,那時會有許多“終端”,基本上是一個簡單的螢幕和鍵盤,連線到中央計算機。可以透過點選 Ubuntu 按鈕並在搜尋框中鍵入“terminal”來找到終端程式,如插圖 1 所示。你也可以使用鍵盤輕鬆訪問終端,方法是按下 control-alt-T。開啟後,可以使用 View/Zoom 選單選項更改文字大小,或使用 Edit/Profile Preferences 選單選項完全更改字型。

雖然我們在研討會期間使用 Linux,但你以後可能無法訪問機器,或者可能不想在你的電腦上獨佔地使用 Linux。雖然你可以將 Linux 作為你的電腦上的“雙啟動”來安裝,或者在虛擬機器中執行它(虛擬機器 (VM) 是你電腦上的一款程式,它充當另一臺電腦,可以執行其他作業系統。有很多 VM 可用,VirtualBox http://www.virtualbox.org/ 是免費的,並且定期更新),但命令列的知識在不同平臺之間具有相當的可移植性。Mac OS X 也隱藏了一個命令列 (/Applications/Utilities/Terminal),並且,除了少數特例之外,在 Linux 命令列上起作用的一切都應該在 OS X 上起作用。Windows 有自己的不相容的命令列版本,但可以安裝 Cygwin http://www.cygwin.com/,它在 Windows 中提供了一個完整的類 Unix 環境。

圖 2:在 Ubuntu 中開啟終端。桌面的右下角顯示了一個部分遮擋的終端

命令列的開頭是命令提示符,它表示計算機已準備好接受命令。提示符是 user@computer:directory$ 形式的文字。圖 2 中的使用者名稱為 tim,在名為 coffee-grinder 的計算機上的 ~ 目錄中。當你同時處理多臺遠端計算機時,擁有所有這些資訊非常方便。提示符是可配置的,並且可能因計算機而異;你可能會注意到,其他提示符略有不同。表 1 中顯示了一些基本命令;嘗試在命令列中鍵入這些命令,並在命令後按回車鍵,告訴計算機執行命令。

圖 3:一些回答人生重要問題的基本命令:“我是誰?”,“我在哪裡?”,“我執行的是什麼作業系統?”
檔案和目錄
[編輯 | 編輯原始碼]

在 Unix 中,所有檔案都以樹狀結構排列:目錄表示為從單個樹幹(“根”)延伸出來的分支,並且依次可以有從它們延伸出來的其他分支(目錄內的目錄),單個檔案是樹的葉子。樹狀結構類似於其他常見作業系統,大多數檔案瀏覽器可以以樹狀方式顯示檔案系統,例如:圖 4 顯示了 Ubuntu Linux 計算機檔案系統的一部分。

圖 4:Ubuntu 檔案系統的樹狀結構。Home/Tim 目錄已開啟以顯示其內容(說明性目的)

Unix 與其他作業系統的不同之處在於檔案系統更多地用於組織不同型別的檔案。基本系統程式都位於/bin 中,它們的共享程式碼(庫)位於/lib 中;類似地,使用者程式位於/usr/bin 中,庫位於/usr/lib 中,手冊頁位於/usr/share/man 中。

有兩種不同的方法可以指定樹中檔案或目錄的位置:絕對路徑和相對於我們在檔案系統中的當前位置的相對路徑(當前工作目錄)。絕對路徑是從根目錄開始的,不依賴於當前工作目錄的位置。從表示根目錄的 / 開始,絕對路徑描述了我們必須遵循的所有目錄(分支)才能到達目標檔案。每個目錄名稱之間用 / 分隔。

例如,home/user/Music/TheKinks/SunnyAfternoon.mp3 指的是 TheKinks 目錄中的 SunnyAfternoon.mp3 檔案,該目錄位於 Music 目錄中,該目錄位於使用者的目錄中,該目錄位於 home 目錄中,該目錄連線到根目錄。如果您熟悉 Microsoft Windows,您可能會注意到路徑分隔符不同。基於 Unix 的系統使用正斜槓 (/) 而不是 Windows 上使用的反斜槓 (\)。您可能已經注意到網頁的路徑也是用正斜槓分隔的,這揭示了它們作為遠端機器上檔案路徑的 Unix 起源。

為了方便起見,一些目錄有特殊的符號作為它們的同義詞,其中最常見的是在圖 5 中列出的。這些符號中的大多數在路徑開頭時具有特殊含義,否則它們只是一個符號。例如,dir/~/ 是當前目錄中 dir 目錄內的~ 目錄,而~/dir/ 是主目錄內的 dir 目錄(通常在 Linux 上為 /home/user,在 Mac OS X 上為 /Users/user)。在這兩種情況下,'/' 符號都是分隔符,而不是根目錄。

圖 5:特殊目錄名稱

可以使用 pwd 命令在命令列顯示當前位置,即工作目錄。我們可以使用相對於我們所在位置的路徑來引用檔案,而不是使用其絕對路徑:當前目錄中的檔案可以用其名稱來引用,工作目錄內的目錄中的檔案可以用 directory/filename 來引用(以此類推對於工作目錄內的目錄內的目錄內的檔案,等等)。請注意,這些路徑與我們描述絕對路徑的方式非常相似,只是它們不以 / 開頭;絕對路徑是相對於根目錄的相對路徑(或者我們可以將初始 / 理解為“轉到根目錄”,並將它們視為相對路徑)。如圖 5 所示,當前目錄上面的目錄可以稱為 ..,因此,如果工作目錄是 /home/user,那麼根目錄可以稱為 ../..(向上一個目錄,然後向上另一個目錄)。符號 .. 可以自由地混合到路徑中:當前目錄下面的示例目錄可以具有路徑 examples/../examples/../examples(不用說,只使用 examples 是推薦的)。

命令
[edit | edit source]

命令只是計算機上其他地方的程式,在命令列輸入它們的名稱就會執行它們。命令具有可預測的格式

command -flags target

命令是要執行的程式的名稱,(可選)標誌修改其行為,目標是命令要操作的內容,通常是檔案的名稱。許多命令既不需要標誌也不需要目標,但 Unix 工具通常非常可配置,即使是簡單的命令如 date(有些實用程式也有仿製品,例如參見ddatesl)也有許多可選標誌來更改其輸出的格式。

如檔案和目錄中所述,有一些特殊的目錄用於存放可執行程式,其中包含的程式可以透過在命令列輸入它們的名稱來執行。您可以簡單地透過鍵入這些目錄中的程式的名稱來執行它們的原因是,作業系統知道在這些目錄中查詢程式。一般來說,您沒有許可權將檔案放置在這些目錄中,經驗豐富的 Unix 使用者會建立自己的目錄,通常是~/bin/,用於放置他們經常使用的程式。建立這個目錄不會使其變得特殊;您仍然必須告訴作業系統也到那裡查詢程式。作業系統有一個變數,$PATH,它是一個包含計算機查詢程式的目錄列表。要將目錄新增到該列表中,請使用命令“export PATH=~/bin:$PATH”,其中“~/bin”是要新增的目錄。此命令通常新增到檔案~/.bashrc 中,該檔案是在每次開啟新終端時自動執行的命令列表。如果程式不在特殊目錄中,您不能只通過鍵入其名稱來執行它,因為計算機不知道在哪裡找到它。即使該程式位於當前目錄中,也是如此。不在特殊目錄中的程式仍然可以執行,但您必須包含其所在位置的路徑。如果該程式位於您的當前工作目錄中,這可能與鍵入 ./program(程式位於當前目錄中)一樣簡單。如果該程式位於其他地方,只需鍵入到該程式所在位置的絕對路徑或相對路徑即可。您始終可以使用命令列的自動完成功能(見下文的“製表符完成”)來減少所需的鍵入量。為了避免鍵入常用程式的路徑,最好將其路徑新增到PATH 變數中 ~/.bashrc 中。

您很快就會發現,滑鼠不會在終端中移動游標。終端介面早於滑鼠普及幾十年,並且已經開發出在周圍移動和編輯的替代方法。大多數常見操作都定義了鍵盤快捷鍵,圖 6 列出了其中的一些。可能最有用的快捷鍵是製表鍵。它可以用於完成檔案系統中的命令名稱和路徑(稱為“製表符完成”)。按一次製表鍵將完成路徑,直到遇到第一個歧義為止,再次按製表鍵將給出可能的完成列表(您可以鍵入您想要的字母或數字,然後再次按製表鍵以嘗試進一步自動完成)。

圖 6:在命令列中移動周圍的常用鍵繫結
圖 7:用於操作檔案的命令

會記錄您輸入的命令,可以使用history 命令列出它們,以便您可以參考之前執行的操作。歷史記錄也可以搜尋:Control-r 啟動搜尋,計算機將在您鍵入時與您的歷史記錄匹配;鍵入 Enter 接受當前行,再次鍵入 Control-r 轉到下一個匹配項,Control-g 取消搜尋。歷史記錄也可以透過使用history 命令列出的條目編號來引用:在命令列中輸入 !n 將重複歷史記錄條目 n,輸入 !! 將重複最後一個命令。

有許多命令,通常非常簡短,用於操作檔案,表 4 列出了其中一些更有用的命令。許多 Unix 命令都有簡短的名稱,通常只有兩三個字母,因此鍵入錯誤很容易產生意外且嚴重的後果!請謹慎輸入,因為 Unix 很少給您第二次機會來糾正錯誤。一些 Unix 機器具有sl 命令來鼓勵準確鍵入。

圖 7 顯示了一些用於操作檔案的命令以及簡短的解釋。

在 Unix 命令列中,一些符號可能具有特殊含義。斜槓 '/' 表示目錄名稱的結尾,星號 '*' 是萬用字元,等等。但是,在許多情況下,符號最好沒有特殊含義,最常見的例子是檔名包含空格(空格在某種意義上是一個特殊字元,因為它被解釋為命令列選項之間的斷點)。可以透過在前面新增一個 '\' 來“轉義”有問題的字元以去除其特殊含義,例如:/ 是根目錄,但 \/ 是一個名為 '/' 的檔案。

以 . 字元開頭的檔案預設情況下是隱藏的,不會出現在 ls 或等效命令的輸出中(或者在使用圖形使用者介面時不會出現在檔案瀏覽器中)。通常,隱藏檔案是計算機或程式直接使用的檔案,包含旨在供使用者理解或使用的配置資訊。

讀寫許可權

[edit | edit source]

所有檔案和目錄都與一組許可權相關聯,描述誰被允許讀取或寫入該檔案。有三種基本許可權:讀取r、寫入w 和執行x。讀取和寫入的含義相當明顯,但執行的含義取決於上下文。對於普通檔案,執行許可權用於具有可執行程式碼(即程式)的檔案,以授予使用者執行該程式的許可權。對於目錄,x 許可權允許使用者開啟該目錄並檢視它包含的檔案。有三種使用者類別:所有者u(通常是建立該檔案的使用者)、組g(所有者所屬的使用者組)和其他o(所有其他人)。每個檔案的許可權都用一個九個字元的字串來描述,每個使用者類別三個字元。分配給每個使用者類別的三個位置對應於三種類型的許可權('r,wx,按此順序)。如果該使用者類別具有給定的許可權,則相應的字母將出現。如果沒有,該字母將被替換為短劃線 '-'。例如,如果使用者類別有權讀取和執行檔案,但無權寫入檔案,則其三元組將顯示為r-x。許可權字串rwxr-x--- 意味著所有者有權讀取、寫入或執行,同一組中的使用者有讀取和執行許可權,而其他使用者沒有許可權。

檔案的擁有者可以更改其許可權。如果一些程式正在由檔案的擁有者執行,它們將自動執行此操作,這會讓人覺得許可權已被忽略。執行rm -f 是使用者最常遇到這種行為的時候:預設情況下,rm 會提示刪除防寫檔案(即您沒有寫許可權的檔案),但-f(強制)標誌告訴它不要打擾詢問,直接刪除該檔案。

處理多個檔案

[編輯 | 編輯原始碼]

通常,特別是在執行指令碼或整理檔案時,您需要一次處理多個檔案。與其顯式地鍵入每個檔名,我們可以提供一個模式而不是檔名。所有檔名都將針對該模式進行檢查,計算機將自動生成所有匹配檔案的列表,以便在執行命令時使用。模式是使用具有特殊含義的符號建立的。例如:* 表示匹配任何內容(或無內容),因此 a*b 是一個模式,它匹配以 a 開頭並以 b 結尾的任何檔名,包括檔案 ab。圖 8 包含一個用於構建模式的有用特殊符號列表。

圖 8:檔名的特殊符號。與表中的 \* 示例一樣,可以透過使用“轉義”字元“\”來防止這些符號中的任何一個具有特殊含義。

如上所述,模式匹配在命令執行之前發生,並且模式將被匹配結果替換。該命令永遠不會看到模式,只會看到匹配的結果。

執行多個程式

[編輯 | 編輯原始碼]

從早期開始,Unix 就被設計為在遠端機器上同時執行多個程式,並且對該功能的支援已整合到命令列中。作業(指令碼、程式或其他從命令列執行的相當自包含的事物)可以根據它們對終端的影響分為兩種型別,前臺作業和後臺作業。前臺作業臨時替換命令列,您無法在它完成之前輸入新命令,而後臺作業獨立執行並允許您繼續執行其他任務。只有前臺作業接收來自鍵盤的輸入,因此像 PAUP* 這樣的互動式程式應該作為前臺執行(儘管您可以設定一個計算密集型分析,將其置於後臺並繼續執行其他任務,同時它正在執行。之後,當計算完成時,該程式可以再次變為前臺,以便可以繼續互動)。儘管後臺作業讓您的命令列大部分可以自由地做其他事情,但它們確實將它們的輸出傳送到您從中啟動它們的終端,因此您可能會看到它在另一個任務的中間彈出,這可能會令人困惑。如果您執行多個後臺作業,它們的輸出將根據它產生的時間交織在一起,沒有任何指示哪個程式產生了輸出。


圖 9:一些用於作業控制的命令和組合鍵

正如圖 9 中所暗示的那樣,作業和程序之間存在區別。一個程序是機器上執行的單個程式,並且每個程序都用 pid(程序 ID)唯一編號。您可以使用 ps 列出您正在執行的所有程序,包括命令列本身(通常稱為 bash,但在某些 unix 發行版中它可能是 zsh 或 tcsh)。命令列本身只是一個在計算機上執行的程序(程式),儘管它專門設計用於啟動、停止和操作其他程序。程序是跟蹤計算機上正在執行的程式的基本方法。另一方面,作業是在命令列上輸入的,其中許多包括多個程式,透過管道(見 輸入、輸出和管道)邏輯地連線在一起以完成一項任務。

瞭解更多詳情)。

圖 10:命令列將作業拆分為多個程序

命令列

將作業拆分為多個程序並執行它們,可能同時執行。參見圖 10 中的說明性示例。

輸入、輸出和管道

[編輯 | 編輯原始碼]

在可能的情況下,Unix 命令的行為類似於過濾器,或者類似於數學上的函式概念:它們從輸入中讀取資料,操作該輸入,然後寫入輸出。這聽起來可能很瑣碎,甚至有些多餘,但它使簡單的命令能夠組合起來產生複雜的結果。每個命令都從 stdin(標準輸入的縮寫)讀取資料,並寫入 stdout(標準輸出的縮寫)。預設情況下,stdin 是從終端和鍵盤中鍵入的任何內容,而 stdout 連線到當前命令列,因此結果將顯示在螢幕上。透過使用大於號 >,stdout 可以輕鬆地重定向到檔案而不是顯示在螢幕上。> 檔名 將 stdout 重定向到指定的檔案,以便稍後檢視。透過將許多簡單的命令連結在一起,可以實現對輸入的複雜轉換。以下是一個高階示例,展示瞭如何使用一系列較小的步驟來實現複雜的輸出。您可能還沒有足夠的 shell 知識來理解此示例中的所有內容,但請嘗試逐一完成它並檢視每個步驟的作用。每個命令的主要頁面(見 獲取幫助)可能會有所幫助。

壓縮的目的是使檔案更小,這對節省磁碟空間和加快透過網際網路傳送檔案都很有用。某些型別的程式可以透明地在傳送之前壓縮檔案,並在另一端解壓縮,從而透過網際網路傳送資料。一些 Web 伺服器實現了這一點,但對我們而言最重要的示例是 scp 和 sftp(用於透過網路傳輸檔案的兩個命令列程式),它們都可以使用 -C 選項來請求壓縮。

簡而言之,壓縮程式在檔案中查詢經常重複的模式,並以稍後可以撤消的方式刪除這種冗餘。文字檔案往往壓縮得很好,100MB 的維基百科可以壓縮到不到 16MB(參見 赫特獎 http://prize.hutter1.net/),特別是,生物序列往往可以很好地壓縮,因為核苷酸或氨基酸字母表的字母數量很少。

用於壓縮檔案的兩個最常見的工具是 gzipbzip2,它們各自用於解壓縮的工具分別是 gunzipbunzip2gzip 是事實上的標準;bzip2 往往會產生更小的檔案,但壓縮時間更長。在 Windows 平臺上,Zip(通常被稱為 WinZip (http://www.winzip.com/))壓縮方法更受歡迎,許多 Unix 平臺提供 zipunzip 工具來處理這些檔案。非 Linux Unix 平臺(例如 Mac OS X)有更舊的工具,稱為 compressuncompress,這些工具現在很少使用。對 Linux 上 compress 壓縮檔案的支援可能不完整且不可靠。例如,一位作者可以訪問的一臺機器具有一個 compress 手冊頁,但沒有安裝實際的工具。

最後要了解的一種方法,這種方法越來越流行,是 7-zip(7za)。7-zip 可以產生比上述所有方法都小的檔案,但壓縮時間更長。圖 11 提供了一個檔案字尾列表,可用於識別使用何種方法壓縮了哪些檔案。

圖 11:用於識別壓縮了哪些檔案的字尾列表

如果將多個檔案組合在一起然後壓縮,而不是單獨壓縮它們,壓縮的效果會更好,因為這使壓縮程式能夠發現檔案之間的重複模式。在 Unix 上,將多個檔案打包/解包到/從單個檔案中的過程在歷史上與壓縮過程是分開的,這與擁有少量能夠做好一件事的工具的理念相一致。Unix 用於打包和解包檔案的工具是 tar“磁帶歸檔器”,這個奇怪的名字是因為它的歷史可以追溯到 1979 年,當時將檔案寫入磁帶是常見的儲存方法。

以下是如何使用 tar 壓縮和解壓縮存檔中的檔案的示例

ls
chimp.fasta human.fasta macaque.fasta orangutan.fasta
# Pack into single file. The suffix is your responsibility.  'c'  means create, and
#'f' means that the next argument is the filename to write to.
tar -cf sequences.tar *.fasta
Note that the original files are untouched

ls
chimp.fasta human.fasta macaque.fasta orangutan.fasta sequences.tar
# Delete all sequences
rm *.fasta
# 'x' means extract
tar -xf sequences.tar
ls
chimp.fasta human.fasta macaque.fasta orangutan.fasta sequences.tar

隨著時間的推移,tar 的功能不斷增加,使其更加方便,現代版本現在能夠打包和壓縮檔案,如上面的示例所示。

ls

chimp.fasta human.fasta macaque.fasta orangutan.fasta sequences.tar
# Pack and gzip sequences simultaneously ( 'z'  tells tar to use gzip)
tar -zcf sequences.tgz *.fasta
#List the contents without extracting
tar -ztf sequences.tgz
chimp.fasta
human.fasta
macaque.fasta
orangutan.fasta
# More recent versions of tar can also bzip2 files
tar -jcf sequences.tbz2 *.fasta
tar -jtf sequences.tbz2
chimp.fasta
human.fasta
macaque.fasta
orangutan.fasta


圖 12:常見壓縮程式的檔案字尾。當與 tar 組合以壓縮多個檔案時,通常將完整的 .tar.suffix 字尾縮短為上面給出的字尾。zip 和 7za“7-zip”具有 Windows 背景,並且具有將多個檔案組合在一起的內建方法,因此很少與 tar 結合使用。file 工具也可用於確定檔案型別,例如:file file.unknown.suffix 。有關詳細資訊,請參見 man file。

壓縮和解壓縮實際上是由同一個程式完成的。像 'gunzip' 這樣的解壓縮程式名稱實際上只是方便的別名,它們告訴計算機以解壓縮標誌呼叫 gzip 程式。

在遠端計算機上工作

[編輯 | 編輯原始碼]

為什麼要使用遠端計算機?原因很多:首先,中央計算資源往往比您的筆記型電腦或 PC 更大、更可靠、更強大——如果您需要完成大量工作或使用大量資料,那麼您可能別無選擇,只能使用更大的計算機。

伺服器級硬體和您桌上的東西之間也存在著天壤之別。不間斷電源(即停電時的備用電池)就是一個例子。伺服器往往還具有冗餘元件和能夠檢測和糾正錯誤的記憶體。在高階,伺服器可以檢測和隔離故障部件,報告問題,並繼續執行。通常,中央伺服器使用者第一次知道發生故障是在工程師帶著替換部件出現的時候。

如果您有一個需要很長時間才能執行的工作,例如貝葉斯系統發育方法,您可能不想承諾讓您的個人計算機閒置足夠長的時間來完成分析(而且您真的信任您的同事不會將其關閉嗎?),而中央設施則始終開啟,並配備電池以防止電源供應中的小故障影響計算機。最後,也是最重要的是,中央計算機往往擁有更嚴格、更完善的資料備份策略——您是否定期備份?它們是否儲存在與原始資料不同的物理位置?您上次檢查備份是否真的有效是什麼時候?

SSH(Secure SHell 的縮寫)是一種連線到其他計算機併為其提供命令列訪問許可權的方法;一旦我們擁有一個命令列,我們就可以像使用本地命令列與本地計算機互動一樣與遠端計算機互動。SSH 替換了連線到遠端計算機的舊方法 telnet,telnet 將所有內容(包括您的密碼)作為普通的未加密文字傳送,因此任何人都可以讀取它。除非您知道自己在做什麼,並且別無選擇,否則不建議使用 telnet。同樣,如果您可以使用 sftp 或 scp,請避免使用 FTP(檔案傳輸協議)傳輸檔案。

除了確保您的計算機和遠端計算機之間的通訊安全外,SSH 還允許您驗證遠端計算機是否是它聲稱的計算機——如果將流量傳送到錯誤的位置,則安全保持流量毫無意義——並防止有人坐在連線中間監聽每條訊息,然後將其傳遞,假裝自己是對方。(這被稱為中間人攻擊 http://en.wikipedia.org/wiki/Man-in-the-middle_attack。雙方都認為自己正在與對方通訊,但實際上是在與一箇中間人通訊,該中間人複製所有訊息,然後將它們轉發。)用於驗證身份的方法,無需偽造,即使有人可以複製和操縱所有訊息,也非常有趣,並且還有很多其他用途。請參閱 http://en.wikipedia.org/wiki/Public-key_cryptographyhttp://en.wikipedia.org/wiki/Digital_signature 瞭解詳細資訊。如果驗證失敗,您將收到類似圖 13 中的警告訊息,並且計算機將拒絕連線。

圖 13:警告訊息

到目前為止,大多數這些警告都是由無能的計算機管理而不是惡意行為造成的(例如,如果有人錯誤地升級了另一臺機器,使其看起來像另一臺計算機,您將收到此類錯誤)。如果您確定它是安全的,可以透過從 ~/.ssh/known_hosts 檔案中刪除計算機的相應行來處理警告。也可以在遠端機器上執行圖形程式,但除非您擁有非常快網際網路連線,否則預計會出現停頓。啟用此功能的系統稱為 X 視窗系統(或簡稱 X 或 X11)(X 是 W 視窗系統的後繼者,如果您想知道 X 從哪裡來)。您可以在執行 ssh 時使用 -X 標誌,以允許遠端計算機在您的本地顯示器上的新視窗中執行程式,前提是您的本地計算機上有能夠理解正在傳送的指令的軟體。Linux 計算機預設情況下使用此類軟體進行顯示,Mac OS X 附帶可以使用的軟體(並在以下示例中由 ssh 自動啟動)。在 Windows 上,Cygwin 軟體提供了所需的功能。以下是如何使用帶 -X 標誌的 ssh 的示例。

傳輸檔案

[edit | edit source]

可以使用 SSH 本身在計算機之間傳輸檔案,但不建議這樣做,因為存在更友好的介面。當然,還有許多圖形檔案傳輸程式可用。不推薦特定的程式,Cyber-duck http://cyberduck.ch/ 用於 Mac OS X 和 WinSCP http://winscp.net/ 用於 Windows,似乎是有用的選擇,但還有很多其他選擇。或者,在 Mac 和 Unix 下,可以掛載遠端計算機上的目錄,使其看起來像是本地的;搜尋 sshfs 以獲取詳細資訊。傳輸檔案時,靜默錯誤非常罕見,但可能會發生,因此我們希望能夠驗證接收到的檔案是否與傳送的檔案相同。可以透過肉眼檢查短檔案,但無法在不再次傳輸檔案的情況下實現自動化(這也可能出現錯誤)。一種常見的驗證正確傳輸的技術是計算兩個檔案的 md5(訊息摘要演算法 5)並比較這些值。md5 是一個簡短的字元字串,用於標識檔案,兩個不同的檔案極不可能共享相同的字串——如果檔案發生更改,其 md5 將(很可能)更改,因此我們知道發生了更改。故意建立兩個具有相同校驗和的不同檔案非常困難。兩個不同的隨機檔案具有相同 md5 的機率約為 3.4e38。當檢查大量檔案時,集合中兩個檔案具有相同 md5 的機率會迅速增加,但對於實際使用來說仍然足夠小。更罕見的是,您可能會遇到 SHA 校驗和,Unix 和 Mac 計算機上的 shasum,它與 md5 非常相似,但兩個檔案共享相同字串的可能性更小。

獲取幫助

[edit | edit source]

有關 Ubuntu 的一般幫助已在“適應”中介紹,或者,只需找到可以諮詢的人即可。與其他一切一樣,網路是良好、不良和徹頭徹尾奇怪教程的豐富來源。

如果您幾乎沒有或根本沒有程式設計經驗,Python (https://python.club.tw/) 是學習如何進行有用的生物資訊學指令碼編寫的不錯選擇,尤其是在與 Biopython 模組 (http://biopython.org/) 結合使用時。Unix 通常有非常好的文件,儘管這些文件通常針對更經驗豐富的使用者。所有手冊頁都傾向於遵循相同的格式,熟悉它是一個好主意。該頁將從命令的描述和所有標誌的摘要開始。可選標誌將用方括號括起來。接下來是對命令的完整描述以及每個標誌的詳細描述。有時還會有一節包含使用示例。Mac OS X 通常對 man 頁非常一致,但 Linux 派生版本可能不盡相同。

圖 14:檢視 man example 的手冊頁

變數和程式設計

[edit | edit source]

到目前為止,我們只使用命令列來執行其他程式並將它們連結起來以實現更復雜的結果。命令列工具可以像程式語言本身一樣使用,我們可以編寫小程式來自動執行常見任務;通常這被稱為指令碼編寫而不是程式設計,儘管區別並不十分重要。

很明顯,學習程式設計不是一兩個小時就能學會的,即使是經驗豐富的程式設計師也要花幾天時間才能在新的語言中提高效率,所以本節只能提供一小部分可能的內容;但是,它應該能夠展示如何透過前期的一點投入就能節省大量時間。如果您對大量檔案做著類似的操作,比如很多序列,在命令列中一遍又一遍地輸入相同的命令既費時又枯燥,而且容易出錯,尤其是當你感到厭煩的時候。指令碼可以節省你大量的時間,讓你可以去做其他事情,而計算機則為你完成這項任務。想想你上次需要重新命名 100 個檔案,或者更改數千個基因比對的格式,以便它們與你的系統發育程式相容。學習一點指令碼可以極大地加快這些任務的速度。就像任何事情一樣,網上有很多教程,搜尋“bash 指令碼教程”或“bash 指令碼入門”會得到很多完整性和可理解性各不相同的例子。

為了給您提供一些程式設計背景知識,我們下面準備了一個簡短的通用教程。

首先介紹的是變數。變數只是一個數據的名稱,一個有用的類比是帶標籤的盒子:每次我們看到標籤時,我們都會在概念上用盒子的內容替換它。操縱變數,改變計算機的狀態,是程式設計的基礎。這裡我們將介紹兩種有用的情況:縮短常見的目錄路徑和對多個檔案執行相同的操作。在 bash 指令碼中,變數用美元符號加變數名來呼叫:$NAME。變數名中的字元有一些限制,並且變數名不能以數字開頭。作為一個經驗法則,最好只在您的變數名中使用大寫或小寫字母。

一個變數可以指代一個檔案的名稱,我們可以使用變數而不是顯式地使用檔名在命令列中寫入內容——改變變數,我們就在不同的檔案上執行完全相同的命令。利用這一點的一種方法是將變數設定為多個檔案中的一個,並使用歷史記錄來重複一組命令。當然,如果命令將其輸出寫入檔案,那麼每次都必須重新命名該檔案,否則每個檔案的輸出都會覆蓋之前檔案的輸出。shell 指令碼提供了一種替代方法:可以告訴計算機將變數依次設定為多個檔名中的每一個,並且可以自動編輯變數的值,以提供唯一輸出檔案的名稱。

一個常見的 Unix 做法是將經常使用的函式集放在一個名為指令碼的檔案中,以便重複使用,從而避免重新輸入它們時出錯。編寫指令碼也意味著可以在提交執行它們處理多個檔案之前測試包含多個步驟的複雜操作,如果我們處理大量基因,這可能需要幾天的時間。指令碼可以在任何常見的文字編輯器中編寫和修改,但必須以文字格式儲存;nano 是一個很好的基本編輯器,使用起來相當直觀,但還有很多其他的編輯器專門為程式設計師設計。或者,您可以使用 gedit,它是一個類似於 Windows 上的記事本的程式(要訪問 gedit,單擊 Ubuntu 按鈕並搜尋 gedit;在命令列中輸入 gedit & 也可以)。

行尾——相容性問題

[edit | edit source]

即使在計算機的標準字母表 (ASCII——美國資訊交換標準程式碼) 建立之後,關於如何指示一行結尾也沒有達成一致。ASCII 提供了兩種可能性:換行符 '\n' 和回車符 '\r' ,基於舊的打字機和電傳打字機終端的工作方式:回車符將列印下一字元的位置移動到行首,換行符將紙張向下移動一行,但不會改變列印位置。在 Unix 上, '\n' 字元被認為是“換行符和回車符”,這用於分隔文字行。在 Windows 上,行用字元對 '\r\n' (按此順序)分隔,舊版本的 Apple 作業系統(早於 OS X)使用 '\r' 來分隔行。Mac OS X 上的情況比較複雜,因為它必須同時處理其 Mac 和 Unix 傳統;現在檔案中的行官方上用 '\n' 分隔,但程式必須能夠處理這兩種約定。

更復雜的是,一些在機器之間傳輸檔案的方法會嘗試自動為您轉換行尾。這通常是一個錯誤。特別是,一個名為 FTP 的舊檔案傳輸方法(檔案傳輸協議)有兩種模式:文字模式和二進位制模式,文字模式會嘗試翻譯行尾。Unix 平臺預設使用二進位制模式,通常是安全的。唯一需要謹慎的情況是從 Windows 使用命令列 FTP 應用程式傳輸檔案。如果您在文字模式下透過 FTP 傳輸二進位制檔案,則接收到的檔案將無法挽回地損壞。如有疑問,請參閱傳輸檔案,瞭解如何驗證您的檔案是否已正確傳輸。

如果您已經讀到這裡,您可能會想:a) 這很複雜,b) 為什麼我以前沒有注意到?答案是,這在過去確實會導致問題,但程式設計師現在已經意識到了這些問題,並且程式往往會做正確的事情。一些程式語言(如 Perl)甚至可以透明地處理這些問題,因此即使是程式設計師也不再需要了解它們了。

Galaxy

[edit | edit source]

Galaxy 是一款針對各種 NGS 應用的開源 GUI 工具集。可以透過賓夕法尼亞州立大學伺服器[5]訪問,或者機構可以建立自己的伺服器。使用者可以儲存和釋出資料歷史記錄,以便將來使用或供其他人使用。它的教程和圖形介面使它易於學習和使用。

使用者可能還希望執行自己的 galaxy 例項,以進行測試、工具開發或生產使用。預配置的 Docker 容器使這變得非常簡單。

以下是示例設定演示。

使用者

docker pull bgruening/galaxy-stable
  • 執行 docker 容器
docker run -itp 8080:80 -v /local/dir/:/export bgruening/galaxy-stable
  • 現在可以訪問位於 https://:8080 的功能齊全的 galaxy 例項

GeneTalk

[edit | edit source]

GeneTalk 中分析 VCF 檔案的 5 個步驟,網址為 www.gene-talk.de

  1. 上傳 VCF 檔案
  2. 編輯系譜和表型資訊,以便進行分離過濾
  3. 透過編輯以下過濾選項來過濾您的 VCF 檔案
    • 功能過濾(過濾掉對蛋白質水平有影響的變異)
    • 連鎖過濾(過濾掉位於指定染色體上的變異)
    • 基因組過濾(按基因或基因組過濾變異,訂閱公開可用的基因組或建立自己的基因組)
    • 頻率過濾(僅顯示基因型頻率低於指定值的變異)
    • 遺傳模式過濾(按推測的遺傳模式過濾變異)
    • 註釋過濾(僅顯示資料庫中列出的變異)
  1. 檢視結果和註釋
  2. 編寫自己的註釋

BaseSpace

[edit | edit source]

參考文獻

[edit | edit source]
  1. "GNU 作業系統". 自由軟體基金會,Inc. 2016 年 4 月 11 日. 檢索於 2016 年 4 月 28 日.
  2. "什麼是版權?". 自由軟體基金會,Inc. 2015年10月3日. 檢索於 2016年4月28日.
  3. Ubuntu 文件團隊. "官方 Ubuntu 文件". Canonical Ltd. 檢索於 2016年4月28日.
  4. McIlroy, M.D.; Pinson, E.N.; Tague, B.A. (1978). "Unix 時分系統:前瞻". 貝爾系統技術雜誌. 57 (6): 1899–1904.{{cite journal}}: CS1 維護:作者列表中的多個名字 (link)
  5. "Galaxy". usegalaxy.org. Galaxy 專案. 檢索於 2016年4月28日.
華夏公益教科書