生信入門系列之 linux 入門(一):初識 linux 系統
Linux 是一個免費的操作系統,是生物信息分析中必不可少的工具。在 linux 系統中,所有的管理任務均可以在一個叫終端(terminal)的控制面板里完成,包括文件處理,軟體安裝以及用戶管理。這個終端是交互的,即你運行特定的命令,相應的結果會在這個終端上顯示出來。運行命令的方式是:在終端上輸入你希望運行的命令,然後按回車鍵(Enter)。如果你想終止正在運行的命令,可以按 Chrl + C。
不同於 windows 系統,linux 的文件系統是一個目錄樹(directory tree);如下圖 所示,其文件系統為一個樹狀結構。最頂端 「root」,用斜杠 「/」 表示。一般來說,普通用戶,無論是直接打開終端還是遠程登陸伺服器,所在的位置一般是在 /home/foo 下,其中的 foo 在這裡指代用戶名。
linux 的樹狀文件系統(圖片來自維基百科)
對於 windows 用戶來說,可以通過一個輕量級的軟體 putty (約 500 kb;百度可下載;雙擊軟體即可使用,無需安裝)來遠程登陸伺服器,登陸方法如下圖,圖中的序號為操作順序:
- 首先在 Host Name(or IP address)下方的框框中輸入伺服器的的 ID 地址,並單擊 「Open」 選項;
- putty 會彈出一個警告框,點擊否;
- 最後最出現下圖 3 中的界面,在 「login as:「 後輸入你的用戶名,回車後輸入登陸密碼(直接輸入就行了,是看不到顯示的)。
打開終端或是遠程登陸伺服器時,如果你想查看當前所在的位置,可以在終端輸入如下命令,並按回車鍵:
pwd
這個 linux 命令意思是「列印當前工作目錄」,是 「print working directory」 的英文縮寫;其返回結果是一個絕對路徑(就是從根目錄開始,依次將各級子目錄的名字組合起來),應該類似這樣:
/home/foo
與上述的樹狀文件系統相互比照,是不是立馬清楚自己到底在哪裡了?就好像 windows 下,到底在哪個盤的哪個文件夾里一樣。這個絕對路徑很有用,它不僅讓我們知道自己在哪兒,同時還可以告訴系統某個軟體在哪兒,以及告訴軟體要操作的文件在哪兒。舉個例子吧,比如說我想調用一個軟體,叫 vcftools,那麼,我要運行它,只需要在終端輸入如下命令並回車:
vcftools --vcf input_data.vcf
就可以輕輕鬆鬆算出 variants 的數目和 individuals 的數目。但很不幸的是,你也有可能得到如下結果:
bash: vcftools: command not found
大概意思就是,系統找不到這個命令在哪兒。可能有人會問了,既然是一個命令,為什麼系統會找不到呢?其實,在linux 系統中,有一個非常核心的概念:一切皆文件!即在linux環境下,任何事物都以文件的形式存在。所以,如果你的從 vcftools 安裝在 /home/foo/biosoft/vcftool-0.1.13/bin 這個絕對路徑下,那麼,你就可以這樣運行它:
/home/foo/biosoft/vcftool-0.1.13/bin/vcftools --vcf input_data.vcf
就可以的結果啦。但也有可能得到如下結果:
VCFtools - v0.1.13(C) Adam Auton and Anthony Marcketta 2009Parameters as interpreted: --vcf input_data.vcfstat error: No such file or directoryError: Cant determine file type of input_data.vcf
這時也不要慌,只要在輸入文件前加上絕對路徑即可。加入 input_data.vcf 文件在 /home/foo/vcffile 下,可以這樣運行:
/home/foo/biosoft/vcftool-0.1.13/bin/vcftools --vcf /home/foo/vcffile/input_data.vcf
這時,如無意外,就可以得到如下結果了:
VCFtools - v0.1.13(C) Adam Auton and Anthony Marcketta 2009Parameters as interpreted: --vcf /home/foo/vcffile/input_data.vcfUsing zlib version: 1.2.3.4Versions of zlib >= 1.2.4 will be *much* faster when reading zipped VCF files.After filtering, kept 16 out of 16 IndividualsAfter filtering, kept 1116595 out of a possible 1116595 SitesRun Time = 5.00 seconds
如果還報出一些奇奇怪怪的錯誤提示,那就首先檢查一下您的輸入法中是否為純英文狀態,中文和全形狀態下的輸入的空格都是會報錯的。同時,linux 里,軟體對字母大小寫是敏感的,即 linux 認為 A 和 a 是兩個不同的事物;也就是說大小寫也是會造成錯誤的。
前面,我多次提到了絕對路徑這個概念,不少心思敏捷的童鞋就會想了,有沒有相對路徑?有的。
舉例說明,假如我們在 /home/foo 這個路徑下,並且我們知道該路徑下有 vcffile 和 biosoft 這兩個目錄;那麼,我們可以這樣運行上述的命令:
biosoft/vcftool-0.1.13/bin/vcftools --vcf vcffile/input_data.vcf
可以看到,biosoft/vcftool-0.1.13/bin 和 vcffile 這兩個路徑都不是以斜杠 / 開頭的,所以這兩個路徑都是相對路徑。當然了,你也可也這樣運行:
biosoft/vcftool-0.1.13/bin/vcftools --vcf /home/foo/vcffile/input_data.vcf
亦或這樣:
biosoft/vcftool-0.1.13/bin/vcftools --vcf vcffile/input_data.vcf
也可以進到 vcffile 這個目錄里,這樣運行:
/home/foo/biosoft/vcftool-0.1.13/bin/vcftools --vcf input_data.vcf
或者這樣( 「..」 在這裡代表上級目錄,相應的,」../..「 代表上級目錄的上級目錄):
../biosoft/vcftool-0.1.13/bin/vcftools --vcf input_data.vcf
總之,想怎麼運行,看心情!
相信看到這裡,會有記憶力超好的童鞋會問了,我該如何像運行 pwd 那樣運行 vcftools 呢?而不是在它前面加上一大串絕對路徑或是相對路徑!
要回答這個問題,小編先給大家展示兩個命令(不深入講解):
第一個是:
which pwd
返回的應該是:
/bin/pwd
第二個是:
echo $PATH
會返回類似下面的結果:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/foo/biosoft/vcftool-0.1.13/bin
眼尖的童鞋會發現,上面一串結果其實就是許多絕對路徑通過 「:」 連接在一起的(叫做環境變數),其中有一個路徑 「/bin」 ;而 which pwd 返回的結果是 /bin/pwd。這兩個有什麼關係呢?其實不必深究,我們只需要知道,linux 把 pwd 看作一個文件(還記得前面說的「一切皆文件」嗎),linux 系統會在上述的環境變數中從左往右依次查找,看某個路徑下是否有 pwd 這個文件,然後執行這個命令。並且,環境變數是可以編輯的, 即可在環境變數 「PATH」 中添加特定的路徑。同理,如果我們的 vcftools 軟體(其實就是個文件)的路徑也在上述的路徑中,就可以在終端直接輸入 vcftools 就可以運行了。
那麼問題來了,我們該如何將特定軟體的路徑發到上述的環境變數 「PATH」 中呢?
只需要通過 export 命令,在終端中輸入以下內容,回車後,就可以將 vcftools 的路徑導入到上述的環境變數中:
# vcftools (井號後的內容 linux 系統不會讀取,可以做注釋)export PATH=$PATH:/home/foo/biosoft/vcftool-0.1.13/bin # 添加這一行就行了,export 後要加空格,不要換行。
就會得到類似這樣的結果:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/foo/biosoft/vcftool-0.1.13/bin
當然,如果你是這樣輸入的,
export PATH=/home/foo/biosoft/vcftool-0.1.13/bin:$PATH
那就應該得到類似這樣的結果:
/home/foo/biosoft/vcftool-0.1.13/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
就可以不加絕對路徑運行 vcftools 了。像這樣:
vcftools --vcf input_data.vcf
但上述做法有一個弊端,就是這個做法是暫時性的,就是說每次打開或登陸終端時,都要運行一下這個命令才行,非常麻煩。所以怎麼辦呢?
其實不難,在每個用戶的家目錄下,即上述的 /home/foo 下,都有一個非常重要的隱藏文件 「.bashrc」,裡面有許多我們每次啟動或登陸終端時,linux 系統都會默認自動運行的命令。所以,只需將
export PATH=$PATH:/home/foo/biosoft/vcftool-0.1.13/bin
添加到 「.bashrc」 文件的最後一行即可。這樣我們每次啟動或登陸終端時,系統就會自動運行這個命令了,這樣就免去可多次手動添加的麻煩。如果不想重啟終端,可以執行這個命令(相當於讓系統執行一遍 「.bashrc」 中的命令):
source .bashrc
怎麼加呢?可以在家目錄下,運行一個文本編輯命令 vim 或 nano:
vim .bashrc
對於 vim 怎麼使用,可以自行百度,有詳細教程,這裡不做贅訴(使用起來比較複雜)。
或另一個命令 nano:
nano .bashrc
這個比較簡單,只需回車後:
- 按向下箭頭(一直到文件最底部)
- 黏貼
export PATH=$PATH:/home/foo/biosoft/vcftool-0.1.13/bin
- 依次按 ctrl + x,y,Enter(即保存退出)
注意1:/home/foo/biosoft/vcftool-0.1.13/bin 要做根據自己的實際路徑做相應地改動。
注意2: 在 linux 系統里,通過 nano 或是 vim 一般是通過上下左右等方向鍵或其它快捷方式移動游標。
重要知識點回顧:- 終端
- 目錄樹
- 家目錄
- 大小寫敏感
- 絕對路徑和相對路徑
- 一切皆文件
- 環境變數及其編輯
本系列下期預告:linux 基礎命令
-----------------------------------------------------
推薦閱讀:
※生信猿如何用好Mac高效工作
※GATK4.0和全基因組數據分析實踐(上)
※開悟時刻
※數據分析終極解決方案!
※DeepVariant: 用卷積神經網路進行DNA序列變異位點檢測