<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          【Linux】PATH和path,傻傻分不清

          共 4561字,需瀏覽 10分鐘

           ·

          2022-06-13 01:05


          習(xí)慣了Windows電腦下的所見(jiàn)即所得,找到程序或文件雙擊即可運(yùn)行或打開(kāi);于是我們被慣得以為電腦會(huì)像人一樣聰明,給他一個(gè)名字就可以運(yùn)行程序或打開(kāi)文件;于是在命令行下或程序里不斷碰壁,為啥這個(gè)命令不運(yùn)行了呢?

          我們不能太高估電腦(或操作系統(tǒng)),不要以為只要輸入一個(gè)程序名或文件名,電腦(或操作系統(tǒng))就可以滿硬盤(pán)的去找這個(gè)文件在哪;這一來(lái)效率太低了,二來(lái)重名了怎么辦?比如有2個(gè)文件都叫“子房.txt”,一個(gè)存儲(chǔ)漢初三杰之張良,一個(gè)存儲(chǔ)被子植物生長(zhǎng)種子的器官;可能打開(kāi)前我們自己也不知道要開(kāi)哪個(gè)吧。


          想一下,我們?cè)赪indows下尋找文件時(shí),是不是先打開(kāi)我的電腦,然后打開(kāi)D盤(pán),打開(kāi)學(xué)習(xí)目錄,再打開(kāi)學(xué)習(xí)計(jì)劃.docx這個(gè)文件。即便我們從來(lái)沒(méi)有執(zhí)行過(guò)這個(gè)計(jì)劃,每天我們還是不厭其煩的一層層打開(kāi)然后制定新的計(jì)劃。只是,我們忽略了這個(gè)一層層打開(kāi)。

          path我們一般指文件的路徑,也就是一層層打開(kāi)的過(guò)程。以Linux為例:

          我們要查看一個(gè)在自己家目錄下的文件 I_am_home.txt,那登錄后,直接可見(jiàn):

          YSX@ehbio:~$ tree
          .
          ├── I_am_home.txt
          └── train
          ├── amplicon
          │ └── pipeline_amplicon.sh
          ├── metagenome
          │ └── pipeline_metagenome.sh
          ├── population_genomics
          │ └── pipeline_gatk.sh
          ├── single_cell
          │ ├── Scanpy.ipynb
          │ └── Seurat.Rmd
          └── transcriptome
          └── pipeline_salmon.sh
          YSX@ehbio:~$ head I_am_home.txt
          I am home!

          那如果想看Seurat.Rmd,怎么查看?一步步找下去就對(duì)了。

          YSX@ehbio:~$ less Seurat.Rmd
          Seurat.Rmd: 沒(méi)有那個(gè)文件或目錄
          YSX@ehbio:~$ less train/Seurat.Rmd
          train/Seurat.Rmd: 沒(méi)有那個(gè)文件或目錄
          YSX@ehbio:~$ less train/single_cell/Seurat.Rmd

          也可以一步步先做目錄切換,然后再查看

          YSX@ehbio:~$ cd train
          YSX@ehbio:~/train$ cd single_cell/
          YSX@ehbio:~/train/single_cell$ less Seurat.Rmd

          那如果你這時(shí)你想運(yùn)行pipeline_metagenome.sh快速分析宏基因組數(shù)據(jù)怎么辦?

          YSX@ehbio:~/train/single_cell$ pipeline_metagenome.sh
          -bash: pipeline_metagenome.sh: 未找到命令

          pipeline_metagenome.sh命令去哪兒了?上面我們都看到了,就在metagenome目錄下,為啥電腦(操作系統(tǒng))這么笨卻找不到?另外為什么運(yùn)行head就可以找到?難道有一些黑魔法在里面?

          確實(shí)是有一些黑魔法的,不過(guò)我們一般稱(chēng)之為規(guī)則

          操作系統(tǒng)為了便捷性和安全性,定義了一系列環(huán)境變量,存儲(chǔ)常用信息,PATH (注意全是大寫(xiě))是其中一個(gè)。

          PATH: 是存放有(可執(zhí)行)命令和程序的目錄集合;在操作系統(tǒng)接到用戶輸入的命令時(shí),會(huì)對(duì)PATH存儲(chǔ)的目錄進(jìn)行查找,看下是否有與用戶輸入的命令同名的文件存在,而且是從前到后一個(gè)個(gè)查找,而且是查到就停,最后查不到就報(bào)錯(cuò)。(從這幾個(gè)加粗的文字,可以看到操作系統(tǒng)很懶,當(dāng)然懶是好的程序員的必備屬性。

          我們先看下PATH里面存了哪些目錄?

          YSX@ehbio:~/train/single_cell$ echo $PATH
          /usr/bin:/usr/local/bin

          在我們前面輸入head命令時(shí),操作系統(tǒng)收到回車(chē)指令后,先去看下$PATH里面有哪些目錄,然后從第一個(gè)/usr/bin開(kāi)始尋找,很幸運(yùn),一下找到了/usr/bin/head文件,嘗試運(yùn)行,成功。所以在這個(gè)情況下,我們輸入head等同于輸入/usr/bin/head。那這個(gè)會(huì)不會(huì)給我們一些啟發(fā)呢?

          我們只要提供pipeline_metagenome.sh的路徑就可以運(yùn)行了。

          # 相對(duì)路徑
          YSX@ehbio:~/train/single_cell$ ../metagenome/pipeline_metagenome.sh
          # 絕對(duì)路徑
          YSX@ehbio:~/train/single_cell$ ~/train/metagenome/pipeline_metagenome.sh
          # 再絕對(duì)一些
          YSX@ehbio:~/train/single_cell$ /home/YSX/train/metagenome/pipeline_metagenome.sh

          程序可以運(yùn)行了,但是不是寫(xiě)起來(lái)太麻煩了?既然head可以只寫(xiě)命令,系統(tǒng)就可以幫著我們?nèi)フ遥敲次覀兪欠褚部梢园?code style="font-size: 0.85em;font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em;padding: 0px 0.3em;white-space: pre-wrap;border-width: 1px;border-style: solid;border-color: rgb(234, 234, 234);background-color: rgb(248, 248, 248);border-radius: 3px;display: inline;">/home/YSX/train/metagenome/放到PATH里面。這就是如何去設(shè)置環(huán)境變量了。

          # 給原變量PATH后面加一個(gè)路徑(絕對(duì)路徑),冒號(hào)(:)分割
          YSX@ehbio:~/train/single_cell$ PATH=$PATH:/home/YSX/train/metagenome/
          # 導(dǎo)出變量,使其對(duì)系統(tǒng)(Shell)可見(jiàn)
          YSX@ehbio:~/train/single_cell$ export PATH
          # 上面兩句可以合并為一句,如下:
          YSX@ehbio:~/train/single_cell$ export PATH=$PATH:/home/YSX/train/metagenome/
          # 再次運(yùn)行,可以運(yùn)行了
          YSX@ehbio:~/train/single_cell$ pipeline_metagenome.sh
          # 看下PATH存儲(chǔ)的目錄,多了我們的新增
          YSX@ehbio:~/train/single_cell$ echo $PATH
          /usr/bin:/usr/local/bin:/home/YSX/train/metagenome/

          這樣就新增一個(gè)目錄到環(huán)境變量里面了,可以依次繼續(xù)增加更多目錄。

          YSX@ehbio:~/train/single_cell$ export PATH=$PATH:/home/YSX/train/metagenome/:/home/YSX/train/amplicon/

          有時(shí)我們也會(huì)看的這樣的寫(xiě)法:export PATH=my_path:$PATH,這與export PATH=$PATH:my_path有什么區(qū)別呢?

          回顧下這幾個(gè)關(guān)鍵字:從前到后查到就停。寫(xiě)出官話就是:PATH中越靠前的路徑優(yōu)先級(jí)越高。這有什么用處呢?

          比如,一般的操作系統(tǒng)都會(huì)有系統(tǒng)的pythonR,通常版本比較老,我們作為普通用戶也沒(méi)權(quán)限修改。

          那怎么辦?自己裝一份,然后用自己的,這時(shí)就涉及到優(yōu)先級(jí)問(wèn)題了。

          假如我在/home/YSX/soft/anaconda/bin下安裝了一個(gè)python,那么我需要設(shè)置優(yōu)先調(diào)用我自己的python,設(shè)置環(huán)境變量時(shí),我就得把/home/YSX/soft/anaconda/bin放到前面,如export PATH=/home/YSX/soft/anaconda/bin:$PATH。如果反過(guò)來(lái)寫(xiě),就/usr/bin/python優(yōu)先被調(diào)用了。

          # which 常用工具,查看當(dāng)前調(diào)用的程序的具體來(lái)源
          YSX@ehbio:~/train/single_cell$ which python
          /usr/bin/python
          # 優(yōu)先調(diào)用自己的python
          YSX@ehbio:~/train/single_cell$ export PATH=/home/YSX/soft/anaconda/bin:$PATH
          YSX@ehbio:~/train/single_cell$ which python
          /home/YSX/soft/anaconda/bin/python

          環(huán)境變量學(xué)會(huì)怎么設(shè)置了,關(guān)機(jī),下班,睡覺(jué)。

          第二天早上起來(lái),打開(kāi)電腦,再運(yùn)行程序

          YSX@ehbio:~/train/single_cell$ which python
          /usr/bin/python
          YSX@ehbio:~/train/single_cell$ pipeline_metagenome.sh
          -bash: pipeline_metagenome.sh: 未找到命令

          結(jié)果發(fā)現(xiàn)昨天的設(shè)置都無(wú)效了,去生信寶典群里提問(wèn) “有誰(shuí)對(duì)Linux比較精通?”。半晌,無(wú)人響應(yīng),敢說(shuō)自己精通的不多。

          后來(lái),有好心人回復(fù)“你遇到什么問(wèn)題,具體描述下?”

          經(jīng)過(guò)半個(gè)小時(shí)的溝通,理清了,關(guān)鍵點(diǎn):環(huán)境變量設(shè)置后失效了,怎么長(zhǎng)期有效?

          如果早這么問(wèn),估計(jì)程序都運(yùn)行完了。

          這時(shí)需要用到另一個(gè)規(guī)則: 登錄遠(yuǎn)程服務(wù)器時(shí),系統(tǒng)會(huì)自動(dòng)運(yùn)行~/.bash_profile里面的命令,所以把前面寫(xiě)的這句話export PATH=/home/YSX/soft/anaconda/bin:$PATH:/home/YSX/train/metagenome/:/home/YSX/train/amplicon/放到文件~/.bash_profile里面就好了。

          文件輸入后,不要忘記source ~/.bash_profile使設(shè)置生效(當(dāng)然,關(guān)掉登錄窗口,再次登錄也可以)。

          以上就是Linux系統(tǒng)的環(huán)境變量設(shè)置,Windows系統(tǒng)的環(huán)境變量擇日再推一期,喜歡的話不妨多多關(guān)注。


          其它被忽略的事情

          1. 軟件可執(zhí)行屬性

          2. 其它環(huán)境變量

            • 環(huán)境變量PATH:

              定義可執(zhí)行程序的目錄

            • LD_LIBRARY_PATH:

              定義動(dòng)態(tài)庫(kù)的目錄

            • PYTHONPATH:

              定義Python包的目錄

            • PERL5LIB:

              定義Perl模塊的目錄

          3. .bashrc和.bash_profile

            • ~/.bashrc本地登錄時(shí)讀取 (文件若無(wú),可新建)

            • ~/.bash_profile遠(yuǎn)程登錄時(shí)讀取(文件若無(wú),可新建)

          4. 如果想在系統(tǒng)層面設(shè)置環(huán)境變量,應(yīng)該寫(xiě)到/etc/profile.d/custom.sh里面(文件若無(wú),可新建)。

          5. 軟件安裝


          往期精彩回顧




          瀏覽 29
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产成人毛片 | 操逼高潮视频 | 九一精品视频 | 影音先锋AV黄色免费电影! | 日一日射一射 |