精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

詳解如何用源代碼安裝軟件,如何卸載它?

系統(tǒng) Linux
Linux 發(fā)行版的一個(gè)最大的優(yōu)點(diǎn)就是它的包管理器和相關(guān)的軟件庫。通過它們提供的資源和工具,你才能夠以完全自動(dòng)化的方式在你的計(jì)算機(jī)上下載和安裝軟件。這篇文章詳細(xì)介紹了在 Linux 中怎么用源代碼安裝程序,以及怎么去卸載用源代碼安裝的程序。

 

詳解如何用源代碼安裝軟件,以及如何卸載它

Linux 發(fā)行版的一個(gè)最大的優(yōu)點(diǎn)就是它的包管理器和相關(guān)的軟件庫。通過它們提供的資源和工具,你才能夠以完全自動(dòng)化的方式在你的計(jì)算機(jī)上下載和安裝軟件。

但是,盡管付出了很多的努力,包維護(hù)者仍然沒法照顧好每種情況,也不可能將所有的可用軟件都打包進(jìn)去。因此,仍然存在需要你自已去編譯和安裝一個(gè)新軟件的情形。對(duì)于我來說,到目前為止,最主要的原因是,我編譯一些軟件是我需要去運(yùn)行一個(gè)特定的版本。或者是我想去修改源代碼或使用一些想要的編譯選項(xiàng)。

如果你也屬于后一種情況,那你已經(jīng)知道你應(yīng)該怎么做了。但是,對(duì)于絕大多數(shù)的 Linux 用戶來說,第一次從源代碼中編譯和安裝一個(gè)軟件看上去像是一個(gè)入門儀式:它讓很多人感到恐懼;但是,如果你能克服困難,你將可能進(jìn)入一個(gè)全新的世界,并且,如果你做到了,那么你將成為社區(qū)中享有特權(quán)的一部分人。

 

A. 在 Linux 中從源代碼開始安裝軟件

這正是我們要做的。因?yàn)檫@篇文章的需要,我要在我的系統(tǒng)上安裝 NodeJS 8.1.1。它是個(gè)完全真實(shí)的版本。這個(gè)版本在 Debian 倉庫中沒有:

  1. sh$ apt-cache madison nodejs | grep amd64
  2. nodejs | 6.11.1~dfsg-1 | http://deb.debian.org/debian experimental/main amd64 Packages
  3. nodejs | 4.8.2~dfsg-1 | http://ftp.fr.debian.org/debian stretch/main amd64 Packages
  4. nodejs | 4.8.2~dfsg-1~bpo8+1 | http://ftp.fr.debian.org/debian jessie-backports/main amd64 Packages
  5. nodejs | 0.10.29~dfsg-2 | http://ftp.fr.debian.org/debian jessie/main amd64 Packages
  6. nodejs | 0.10.29~dfsg-1~bpo70+1 | http://ftp.fr.debian.org/debian wheezy-backports/main amd64 Packages

 

第 1 步:從 GitHub 上獲取源代碼

像大多數(shù)開源項(xiàng)目一樣,NodeJS 的源代碼可以在 GitHub:https://github.com/nodejs/node 上找到。

所以,我們直接開始吧。

The NodeJS official GitHub repository

The NodeJS official GitHub repository

如果你不熟悉 GitHubgit 或者提到的其它 版本管理系統(tǒng)包含了這個(gè)軟件的源代碼,以及多年來對(duì)該軟件的所有修改的歷史。甚至可以回溯到該軟件的最早版本。對(duì)于開發(fā)者來說,保留它的歷史版本有很多好處。如今對(duì)我來說,其中一個(gè)好處是可以得到任何一個(gè)給定時(shí)間點(diǎn)的項(xiàng)目源代碼。更準(zhǔn)確地說,我可以得到我所要的 8.1.1 發(fā)布時(shí)的源代碼。即便從那之后他們有了很多的修改。

Choose the v8.1.1 tag in the NodeJS GitHub repository

Choose the v8.1.1 tag in the NodeJS GitHub repository

在 GitHub 上,你可以使用 “branch” (分支)按鈕導(dǎo)航到這個(gè)軟件的不同版本。“分支” 和 “標(biāo)簽” 是 Git 中一些相關(guān)的概念。總的來說,開發(fā)者創(chuàng)建 “分支” 和 “標(biāo)簽” 來在項(xiàng)目歷史中對(duì)重要事件保持跟蹤,比如當(dāng)他們啟用一個(gè)新特性或者發(fā)布一個(gè)新版本時(shí)。在這里先不詳細(xì)介紹了,你現(xiàn)在只需要知道我在找被標(biāo)記為 “v8.1.1” 的版本。

The NodeJS GitHub repository as it was at the time the v8.1.1 tag was created

The NodeJS GitHub repository as it was at the time the v8.1.1 tag was created

在選擇了 “v8.1.1” 標(biāo)簽后,頁面被刷新,最顯著的變化是標(biāo)簽現(xiàn)在作為 URL 的一部分出現(xiàn)。另外,你可能會(huì)注意到文件改變?nèi)掌谝灿兴煌D悻F(xiàn)在看到的源代碼樹是創(chuàng)建了 v8.1.1 標(biāo)簽時(shí)的代碼。在某種意義上,你也可以認(rèn)為像 git 這樣的版本管理工具是一個(gè)時(shí)光穿梭機(jī),允許你在項(xiàng)目歷史中來回穿梭。

NodeJS GitHub repository download as a ZIP button

NodeJS GitHub repository download as a ZIP button

此時(shí),我們可以下載 NodeJS 8.1.1 的源代碼。你不要忘記去點(diǎn)那個(gè)建議的大的藍(lán)色按鈕來下載一個(gè)項(xiàng)目的 ZIP 壓縮包。對(duì)于我來說,為講解的目的,我從命令行中下載并解壓這個(gè) ZIP 壓縮包。但是,如果你更喜歡使用一個(gè) GUI 工具,不用擔(dān)心,你可以取代下面的命令方式:

  1. wget https://github.com/nodejs/node/archive/v8.1.1.zip
  2. unzip v8.1.1.zip
  3. cd node-8.1.1/

下載一個(gè) ZIP 包就可以,但是如果你希望“像個(gè)專家一樣”,我建議你直接使用 git 工具去下載源代碼。它一點(diǎn)也不復(fù)雜 — 并且如果你是第一次使用該工具,它將是一個(gè)很好的開端,你以后將經(jīng)常用到它:

  1. # first ensure git is installed on your system
  2. sh$ sudo apt-get install git
  3. # Make a shallow clone the NodeJS repository at v8.1.1
  4. sh$ git clone --depth 1 \
  5. --branch v8.1.1 \
  6. https://github.com/nodejs/node
  7. sh$ cd node/

順便說一下,如果你有任何問題,這篇文章的第一部分只是做一個(gè)總體介紹而已。后面,為了幫你排除常見問題,我們將基于 Debian 和基于 RedHat 的發(fā)行版更詳細(xì)地解釋。

不管怎樣,在你使用 git 或者作為一個(gè) ZIP 壓縮包下載了源代碼后,在當(dāng)前目錄下就有了同樣的源代碼文件:

  1. sh$ ls
  2. android-configure BUILDING.md common.gypi doc Makefile src
  3. AUTHORS CHANGELOG.md configure GOVERNANCE.md node.gyp test
  4. benchmark CODE_OF_CONDUCT.md CONTRIBUTING.md lib node.gypi tools
  5. BSDmakefile COLLABORATOR_GUIDE.md deps LICENSE README.md vcbuild.bat

 

第 2 步:理解程序的構(gòu)建系統(tǒng)

構(gòu)建系統(tǒng)就是我們通常所說的“編譯源代碼”,其實(shí),編譯只是從源代碼中生成一個(gè)可使用的軟件的其中一個(gè)階段。構(gòu)建系統(tǒng)是一套工具,用于自動(dòng)處置不同的任務(wù),以便可以僅通過幾個(gè)命令就能構(gòu)建整個(gè)軟件。

雖然概念很簡(jiǎn)單,實(shí)際上編譯做了很多事情。因?yàn)椴煌捻?xiàng)目或者編程語言也許有不同的要求,或者因?yàn)榫幊陶叩暮脨海蛘咭驗(yàn)橹С值钠脚_(tái)、或者因?yàn)闅v史的原因,等等等等 … 選擇或創(chuàng)建另外一個(gè)構(gòu)建系統(tǒng)的原因幾乎數(shù)不清。這方面有許多種不同的解決方案。

NodeJS 使用一種 GNU 風(fēng)格的構(gòu)建系統(tǒng)。這在開源社區(qū)中這是一個(gè)很流行的選擇。由此開始,你將進(jìn)入一段精彩的旅程。

寫出和調(diào)優(yōu)一個(gè)構(gòu)建系統(tǒng)是一個(gè)非常復(fù)雜的任務(wù)。但是,作為 “終端用戶” 來說,GNU 風(fēng)格的構(gòu)建系統(tǒng)使用兩個(gè)工具讓他們免于此難:configure 和 make

configure 文件是個(gè)項(xiàng)目專用的腳本,它將檢查目標(biāo)系統(tǒng)的配置和可用功能,以確保該項(xiàng)目可以被構(gòu)建,并最終吻合當(dāng)前平臺(tái)的特性。

一個(gè)典型的 configure 任務(wù)的重要部分是去構(gòu)建 Makefile。這個(gè)文件包含了有效構(gòu)建項(xiàng)目所需的指令。

另一方面,make 工具,這是一個(gè)可用于任何類 Unix 系統(tǒng)的 POSIX 工具。它將讀取項(xiàng)目專用的 Makefile 然后執(zhí)行所需的操作去構(gòu)建和安裝你的程序。

但是,在 Linux 的世界中,你仍然有一些定制你自己專用的構(gòu)建的理由。

  1. ./configure --help

configure -help 命令將展示你可用的所有配置選項(xiàng)。再強(qiáng)調(diào)一下,這是非常的項(xiàng)目專用。說實(shí)話,有時(shí)候,在你完全理解每個(gè)配置選項(xiàng)的作用之前,你需要深入到項(xiàng)目中去好好研究。

不過,這里至少有一個(gè)標(biāo)準(zhǔn)的 GNU 自動(dòng)化工具選項(xiàng)是你該知道的,它就是眾所周知的 --prefix 選項(xiàng)。它與文件系統(tǒng)的層次結(jié)構(gòu)有關(guān),它是你軟件要安裝的位置。

 

第 3 步:文件系統(tǒng)層次化標(biāo)準(zhǔn)(FHS)

大部分典型的 Linux 發(fā)行版的文件系統(tǒng)層次結(jié)構(gòu)都遵從 文件系統(tǒng)層次化標(biāo)準(zhǔn)(FHS)

這個(gè)標(biāo)準(zhǔn)說明了你的系統(tǒng)中各種目錄的用途,比如,/usr/tmp/var 等等。

當(dāng)使用 GNU 自動(dòng)化工具 和大多數(shù)其它的構(gòu)建系統(tǒng) 時(shí),它會(huì)把新軟件默認(rèn)安裝在你的系統(tǒng)的 /usr/local 目錄中。這是依據(jù) FHS 中 /usr/local 層級(jí)是為系統(tǒng)管理員本地安裝軟件時(shí)使用的,它在系統(tǒng)軟件更新覆蓋時(shí)是安全的。它也可以用于存放在一組主機(jī)中共享,但又沒有放到 /usr 中的程序和數(shù)據(jù)”,因此,它是一個(gè)非常好的選擇。

/usr/local 層級(jí)以某種方式復(fù)制了根目錄,你可以在 /usr/local/bin 這里找到可執(zhí)行程序,在 /usr/local/lib 中找到庫,在 /usr/local/share 中找到架構(gòu)無關(guān)的文件,等等。

使用 /usr/local 樹作為你定制安裝的軟件位置的唯一問題是,你的軟件的文件將在這里混雜在一起。尤其是你安裝了多個(gè)軟件之后,將很難去準(zhǔn)確地跟蹤 /usr/local/bin 和 /usr/local/lib 中的哪個(gè)文件到底屬于哪個(gè)軟件。它雖然不會(huì)導(dǎo)致系統(tǒng)的問題。畢竟,/usr/bin 也是一樣混亂的。但是,有一天你想去卸載一個(gè)手工安裝的軟件時(shí)它會(huì)將成為一個(gè)問題。

要解決這個(gè)問題,我通常喜歡安裝定制的軟件到 /opt 子目錄下。再次引用 FHS:

/opt 是為安裝附加的應(yīng)用程序軟件包而保留的。

包安裝在 /opt 下的軟件包必須將它的靜態(tài)文件放在單獨(dú)的 /opt/<package> 或者 /opt/<provider> 目錄中,此處 <package> 是所說的那個(gè)軟件名的名字,而 <provider> 處是提供者的 LANANA 注冊(cè)名字。”(LCTT 譯注:LANANA 是指 The Linux Assigned Names And Numbers Authority。 )

因此,我們將在 /opt 下創(chuàng)建一個(gè)子目錄,用于我們定制的 NodeJS 安裝。并且,如果有一天我想去卸載它,我只是很簡(jiǎn)單地去刪除那個(gè)目錄:

  1. sh$ sudo mkdir /opt/node-v8.1.1
  2. sh$ sudo ln -sT node-v8.1.1 /opt/node
  3. # What is the purpose of the symbolic link above?
  4. # Read the article till the end--then try to answer that
  5. # question in the comment section!
  6.  
  7. sh$ ./configure --prefix=/opt/node-v8.1.1
  8. sh$ make -j9 && echo ok
  9. # -j9 means run up to 9 parallel tasks to build the software.
  10. # As a rule of thumb, use -j(N+1) where N is the number of cores
  11. # of your system. That will maximize the CPU usage (one task per
  12. # CPU thread/core + a provision of one extra task when a process
  13. # is blocked by an I/O operation.

在你運(yùn)行完成 make 命令之后,如果有任何的除了 “ok” 以外的信息,將意味著在構(gòu)建過程中有錯(cuò)誤。當(dāng)我們使用一個(gè) -j 選項(xiàng)去運(yùn)行并行構(gòu)建時(shí),在構(gòu)建系統(tǒng)的大量輸出過程中,檢索錯(cuò)誤信息并不是件很容易的事。

在這種情況下,只能是重新開始 make,并且不要使用 -j 選項(xiàng)。這樣錯(cuò)誤將會(huì)出現(xiàn)在輸出信息的最后面:

  1. sh$ make

最終,編譯結(jié)束后,你可以運(yùn)行這個(gè)命令去安裝你的軟件:

  1. sh$ sudo make install

然后測(cè)試它:

  1. sh$ /opt/node/bin/node --version
  2. v8.1.1

 

B. 如果在源代碼安裝的過程中出現(xiàn)錯(cuò)誤怎么辦?

我上面介紹的大多是你能在文檔完備的項(xiàng)目的“構(gòu)建指令”頁面上看到。但是,本文的目標(biāo)是讓你從源代碼開始去編譯你的第一個(gè)軟件,它可能要花一些時(shí)間去研究一些常見的問題。因此,我將再次重新開始一遍整個(gè)過程,但是,這次是在一個(gè)最新的、最小化安裝的 Debian 9.0 和 CentOS 7.0 系統(tǒng)上。因此,你可能看到我遇到的錯(cuò)誤以及我怎么去解決它。

從 Debian 9.0 中 “Stretch” 開始

  1. itsfoss@debian:~$ git clone --depth 1 \
  2. --branch v8.1.1 \
  3. https://github.com/nodejs/node
  4. -bash: git: command not found

這個(gè)問題非常容易去診斷和解決。去安裝這個(gè) git 包即可:

  1. itsfoss@debian:~$ sudo apt-get install git
  1. itsfoss@debian:~$ git clone --depth 1 \
  2. --branch v8.1.1 \
  3. https://github.com/nodejs/node && echo ok
  4. [...]
  5. ok
  1. itsfoss@debian:~/node$ sudo mkdir /opt/node-v8.1.1
  2. itsfoss@debian:~/node$ sudo ln -sT node-v8.1.1 /opt/node

現(xiàn)在沒有問題了。

  1. itsfoss@debian:~/node$ ./configure --prefix=/opt/node-v8.1.1/
  2. WARNING: failed to autodetect C++ compiler version (CXX=g++)
  3. WARNING: failed to autodetect C compiler version (CC=gcc)
  4. Node.js configure error: No acceptable C compiler found!
  5. Please make sure you have a C compiler installed on your system and/or
  6. consider adjusting the CC environment variable if you installed
  7. it in a non-standard prefix.

很顯然,編譯一個(gè)項(xiàng)目,你需要一個(gè)編譯器。NodeJS 是使用 C++ 語言 寫的,我們需要一個(gè) C++ 編譯器。在這里我將安裝 g++,它就是為這個(gè)目的寫的 GNU C++ 編譯器:

  1. itsfoss@debian:~/node$ sudo apt-get install g++
  2. itsfoss@debian:~/node$ ./configure --prefix=/opt/node-v8.1.1/ && echo ok
  3. [...]
  4. ok
  1. itsfoss@debian:~/node$ make -j9 && echo ok
  2. -bash: make: command not found

還差一個(gè)其它工具。同樣的癥狀。同樣的解決方案:

  1. itsfoss@debian:~/node$ sudo apt-get install make
  2. itsfoss@debian:~/node$ make -j9 && echo ok
  3. [...]
  4. ok
  1. itsfoss@debian:~/node$ sudo make install
  2. [...]
  3. itsfoss@debian:~/node$ /opt/node/bin/node --version
  4. v8.1.1

成功!

請(qǐng)注意:我將一次又一次地安裝各種工具去展示怎么去診斷編譯問題,以及展示怎么去解決這些問題。但是,如果你搜索關(guān)于這個(gè)主題的更多文檔,或者讀其它的教程,你將發(fā)現(xiàn),很多發(fā)行版有一個(gè) “meta-packages”,它包羅了安裝一些或者全部的用于編譯軟件的常用工具。在基于 Debian 的系統(tǒng)上,你或許遇到過 build-essentials 包,它就是這種用作。在基于 Red Hat 的發(fā)行版中,它將是  “Development Tools” 組。

 

在 CentOS 7.0 上

  1. [itsfoss@centos ~]$ git clone --depth 1 \
  2. --branch v8.1.1 \
  3. https://github.com/nodejs/node
  4. -bash: git: command not found

命令沒有找到?可以用 yum 包管理器去安裝它:

  1. [itsfoss@centos ~]$ sudo yum install git
  1. [itsfoss@centos ~]$ git clone --depth 1 \
  2. --branch v8.1.1 \
  3. https://github.com/nodejs/node && echo ok
  4. [...]
  5. ok
  1. [itsfoss@centos ~]$ sudo mkdir /opt/node-v8.1.1
  2. [itsfoss@centos ~]$ sudo ln -sT node-v8.1.1 /opt/node
  1. [itsfoss@centos ~]$ cd node
  2. [itsfoss@centos node]$ ./configure --prefix=/opt/node-v8.1.1/
  3. WARNING: failed to autodetect C++ compiler version (CXX=g++)
  4. WARNING: failed to autodetect C compiler version (CC=gcc)
  5. Node.js configure error: No acceptable C compiler found!
  6.  
  7. Please make sure you have a C compiler installed on your system and/or
  8. consider adjusting the CC environment variable if you installed
  9. it in a non-standard prefix.

你知道的:NodeJS 是使用 C++ 語言寫的,但是,我的系統(tǒng)缺少合適的編譯器。Yum 可以幫到你。因?yàn)椋也皇且粋€(gè)合格的 CentOS 用戶,我實(shí)際上是在互聯(lián)網(wǎng)上搜索到包含 g++ 編譯器的包的確切名字的。這個(gè)頁面指導(dǎo)了我:https://superuser.com/questions/590808/yum-install-gcc-g-doesnt-work-anymore-in-centos-6-4

  1. [itsfoss@centos node]$ sudo yum install gcc-c++
  2. [itsfoss@centos node]$ ./configure --prefix=/opt/node-v8.1.1/ && echo ok
  3. [...]
  4. ok
  1. [itsfoss@centos node]$ make -j9 && echo ok
  2. [...]
  3. ok
  1. [itsfoss@centos node]$ sudo make install && echo ok
  2. [...]
  3. ok
  1. [itsfoss@centos node]$ /opt/node/bin/node --version
  2. v8.1.1

再次成功!

 

C. 從源代碼中對(duì)要安裝的軟件做一些改變

從源代碼中安裝一個(gè)軟件,可能是因?yàn)槟愕姆职l(fā)倉庫中沒有一個(gè)可用的特定版本。或者因?yàn)槟阆肴?修改 那個(gè)程序。也可能是修復(fù)一個(gè) bug 或者增加一個(gè)特性。畢竟,開源軟件這些都可以做到。因此,我將抓住這個(gè)機(jī)會(huì),讓你親自體驗(yàn)怎么去編譯你自己的軟件。

在這里,我將在 NodeJS 源代碼上做一個(gè)微小改變。然后,我們將看到我們的改變將被納入到軟件的編譯版本中:

用你喜歡的 文本編輯器(如,vim、nano、gedit、 … )打開文件 node/src/node.cc。然后,嘗試找到如下的代碼片段:

  1. if (debug_options.ParseOption(argv[0], arg)) {
  2. // Done, consumed by DebugOptions::ParseOption().
  3. } else if (strcmp(arg, "--version") == 0 || strcmp(arg, "-v") == 0) {
  4. printf("%s\n", NODE_VERSION);
  5. exit(0);
  6. } else if (strcmp(arg, "--help") == 0 || strcmp(arg, "-h") == 0) {
  7. PrintHelp();
  8. exit(0);
  9. }

它在 文件的 3830 行 附近。然后,修改包含 printf 的行,將它替換成如下內(nèi)容:

  1. printf("%s (compiled by myself)\n", NODE_VERSION);

然后,返回到你的終端。在繼續(xù)之前,為了對(duì)強(qiáng)大的 Git 支持有更多的了解,你可以去檢查一下,你修改是文件是否正確:

  1. diff --git a/src/node.cc b/src/node.cc
  2. index bbce1022..a5618b57 100644
  3. --- a/src/node.cc
  4. +++ b/src/node.cc
  5. @@ -3828,7 +3828,7 @@ static void ParseArgs(int* argc,
  6. if (debug_options.ParseOption(argv[0], arg)) {
  7. // Done, consumed by DebugOptions::ParseOption().
  8. } else if (strcmp(arg, "--version") == 0 || strcmp(arg, "-v") == 0) {
  9. - printf("%s\n", NODE_VERSION);
  10. + printf("%s (compiled by myself)\n", NODE_VERSION);
  11. exit(0);
  12. } else if (strcmp(arg, "--help") == 0 || strcmp(arg, "-h") == 0) {
  13. PrintHelp();

在你前面改變的那行之前,你將看到一個(gè) “-” (減號(hào)標(biāo)志)。而在改變之后的行前面有一個(gè) “+” (加號(hào)標(biāo)志)。

現(xiàn)在可以去重新編譯并重新安裝你的軟件了:

  1. make -j9 && sudo make install && echo ok
  2. [...]
  3. ok

這個(gè)時(shí)候,可能失敗的唯一原因就是你改變代碼時(shí)的輸入錯(cuò)誤。如果就是這種情況,在文本編輯器中重新打開 node/src/node.cc 文件并修復(fù)錯(cuò)誤。

一旦你完成了新修改版本的 NodeJS 的編譯和安裝,就可以去檢查你的修改是否包含到軟件中:

  1. itsfoss@debian:~/node$ /opt/node/bin/node --version
  2. v8.1.1 (compiled by myself)

恭喜你!你對(duì)開源程序做出了你的第一個(gè)改變!

 

D. 讓 shell 找到我們定制構(gòu)建的軟件

到目前為止,你可能注意到,我通常啟動(dòng)我新編譯的 NodeJS 軟件是通過指定到該二進(jìn)制文件的絕對(duì)路徑。

  1. /opt/node/bin/node

這是可以正常工作的。但是,這樣太麻煩。實(shí)際上有兩種辦法可以去解決這個(gè)問題。但是,去理解它們,你必須首先明白,你的 shell 定位可執(zhí)行文件是通過在環(huán)境變量 PATH 中指定的目錄里面查找的。

  1. itsfoss@debian:~/node$ echo $PATH
  2. /usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

在這個(gè) Debian 系統(tǒng)上,如果你不指定一個(gè)精確的目錄做為命令名字的一部分,shell 將首先在 /usr/local/bin 中查找可執(zhí)行程序;如果沒有找到,然后進(jìn)入 /usr/bin 中查找;如果沒有找到,然后進(jìn)入 /bin查找;如果沒有找到,然后進(jìn)入 /usr/local/games 查找;如果沒有找到,然后進(jìn)入 /usr/games 查找;如果沒有找到,那么,shell 將報(bào)告一個(gè)錯(cuò)誤,“command not found”

由此,我們可以知道有兩種方法去確保命令可以被 shell 訪問到:將它(該二進(jìn)制程序)增加到已經(jīng)配置好的 PATH 目錄中,或者將包含可執(zhí)行程序的目錄添加到 PATH 中。

 

從 /usr/local/bin 中添加一個(gè)鏈接

只是從 /opt/node/bin 中 拷貝 NodeJS 二進(jìn)制可執(zhí)行文件到 /usr/local/bin 是一個(gè)錯(cuò)誤的做法。因?yàn)椋绻@么做,該可執(zhí)行程序?qū)o法定位到在 /opt/node/ 中的需要的其它組件。(軟件以它自己的位置去定位它所需要的資源文件是常見的做法)

因此,傳統(tǒng)的做法是去使用一個(gè)符號(hào)鏈接:

  1. itsfoss@debian:~/node$ sudo ln -sT /opt/node/bin/node /usr/local/bin/node
  2. itsfoss@debian:~/node$ which -a node || echo not found
  3. /usr/local/bin/node
  4. itsfoss@debian:~/node$ node --version
  5. v8.1.1 (compiled by myself)

這一個(gè)簡(jiǎn)單而有效的解決辦法,尤其是,如果一個(gè)軟件包是由好幾個(gè)眾所周知的可執(zhí)行程序組成的,因?yàn)椋銓槊總€(gè)用戶調(diào)用的命令創(chuàng)建一個(gè)符號(hào)鏈接。例如,如果你熟悉 NodeJS,你知道應(yīng)用的 npm 組件,也應(yīng)該從 /usr/local/bin 做個(gè)符號(hào)鏈接。我把這個(gè)留給你做練習(xí)。

 

修改 PATH

首先,如果你嘗試過前面的解決方案,請(qǐng)先移除前面創(chuàng)建的節(jié)點(diǎn)符號(hào)鏈接,去從一個(gè)干凈的狀態(tài)開始:

  1. itsfoss@debian:~/node$ sudo rm /usr/local/bin/node
  2. itsfoss@debian:~/node$ which -a node || echo not found
  3. not found

現(xiàn)在,這里有一個(gè)改變你的 PATH 的魔法命令:

  1. itsfoss@debian:~/node$ export PATH="/opt/node/bin:${PATH}"
  2. itsfoss@debian:~/node$ echo $PATH
  3. /opt/node/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

簡(jiǎn)單說就是,我用環(huán)境變量 PATH 之前的內(nèi)容前綴了一個(gè) /opt/node/bin 替換了其原先的內(nèi)容。因此,你可以想像一下,shell 將先進(jìn)入到 /opt/node/bin 目錄中查找可執(zhí)行程序。我們也可以使用 which 命令去確認(rèn)一下:

  1. itsfoss@debian:~/node$ which -a node || echo not found
  2. /opt/node/bin/node
  3. itsfoss@debian:~/node$ node --version
  4. v8.1.1 (compiled by myself)

鑒于 “符號(hào)鏈接” 解決方案是永久的,只要?jiǎng)?chuàng)建到 /usr/local/bin 的符號(hào)鏈接就行了,而對(duì) PATH 的改變僅影響到當(dāng)前的 shell。你可以自己做一些研究,如何做到對(duì) PATH 的永久改變。給你一個(gè)提示,可以將它寫到你的 “profile” 中。如果你找到這個(gè)解決方案,不要猶豫,通過下面的評(píng)論區(qū)共享給其它的讀者!

 

E. 怎么去卸載剛才從源代碼中安裝的軟件

因?yàn)槲覀兌ㄖ凭幾g的 NodeJS 軟件全部在 /opt/node-v8.1.1 目錄中,卸載它不需要做太多的工作,僅使用 rm 命令去刪除那個(gè)目錄即可:

  1. sudo rm -rf /opt/node-v8.1.1

注意:sudo 和 rm -rf 是 “非常危險(xiǎn)的雞尾酒”!一定要在按下回車鍵之前多檢查幾次你的命令。你不會(huì)得到任何的確認(rèn)信息,并且如果你刪除了錯(cuò)誤的目錄它是不可恢復(fù)的 …

然后,如果你修改了你的 PATH,你可以去恢復(fù)這些改變。它一點(diǎn)也不復(fù)雜。

如果你從 /usr/local/bin 創(chuàng)建了一個(gè)符號(hào)鏈接,你應(yīng)該去刪除它們:

  1. itsfoss@debian:~/node$ sudo find /usr/local/bin \
  2. -type l \
  3. -ilname "/opt/node/*" \
  4. -print -delete
  5. /usr/local/bin/node

 

等等? 依賴地獄在哪里?

作為最終的討論,如果你讀過有關(guān)的編譯定制軟件的文檔,你可能聽到關(guān)于 依賴地獄dependency hell 的說法。那是在你能夠成功編譯一個(gè)軟件之前,對(duì)那種煩人情況的一個(gè)別名,你必須首先編譯一個(gè)前提條件所需要的庫,它又可能要求其它的庫,而這些庫有可能與你的系統(tǒng)上已經(jīng)安裝的其它軟件不兼容。

發(fā)行版的軟件包維護(hù)者的部分工作,就是實(shí)際去地解決那些依賴地獄,確保你的系統(tǒng)上的各種軟件都使用了兼容的庫,并且按正確的順序去安裝。

在這篇文章中,我特意選擇了 NodeJS 去安裝,是因?yàn)樗鼛缀鯖]有依賴。我說 “幾乎” 是因?yàn)椋瑢?shí)際上,它   依賴。但是,這些源代碼的依賴已經(jīng)預(yù)置到項(xiàng)目的源倉庫中(在 node/deps 子目錄下),因此,在你動(dòng)手編譯之前,你不用手動(dòng)去下載和安裝它們。

如果你有興趣了解更多關(guān)于那個(gè)問題的知識(shí)和學(xué)習(xí)怎么去處理它。請(qǐng)?jiān)谙旅娴脑u(píng)論區(qū)告訴我,它將是更高級(jí)別的文章的好主題!


作者簡(jiǎn)介:

充滿激情的工程師,職業(yè)是教師,我的目標(biāo)是:熱心分享我所教的內(nèi)容,并讓我的學(xué)生自己培養(yǎng)它們的技能。你也可以在我的網(wǎng)站上聯(lián)系到我。 

責(zé)任編輯:龐桂玉 來源: Linux中國
相關(guān)推薦

2011-09-15 11:14:12

2009-12-21 13:55:40

Linux軟件

2011-03-02 11:28:28

vsftpd配置

2010-05-17 09:45:00

subversion源

2023-12-12 09:00:00

2020-11-12 11:50:20

OpenHarmony

2018-05-17 10:05:24

運(yùn)行iPadPython

2016-10-11 16:28:11

源代碼

2010-06-22 15:31:22

autoconf安裝

2017-01-12 09:57:04

2010-09-16 15:13:30

Symbian^3Symbian

2019-03-24 14:14:40

代碼閱讀源代碼

2014-09-22 19:30:02

大數(shù)據(jù)軟件分析金融數(shù)據(jù)

2011-07-26 10:09:07

組策略軟件部署

2020-02-19 13:11:52

阿里 AI 代碼

2020-02-28 15:33:12

代碼人工智能檢測(cè)

2022-09-03 15:03:36

AndroidGerrit代碼審核

2015-08-10 11:09:09

Python代碼Python

2022-08-12 15:06:13

區(qū)塊鏈環(huán)境比特幣

2018-12-20 09:00:00

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

韩日一区二区| 免费av在线播放| 国产日韩欧美三区| 亚洲午夜性刺激影院| 亚洲精品自拍网| 色黄网站在线观看| 91啪亚洲精品| 91免费看片在线| 日本视频免费在线| 97偷自拍亚洲综合二区| 亚洲黄色www网站| 三上悠亚在线一区二区| 国产精品一二三产区| 国产精品久久久久婷婷| 国产一区免费观看| 国产老女人乱淫免费| 国产亚洲一级| 欧美精品在线播放| 老头老太做爰xxx视频| 秋霞一区二区| 欧美中文字幕一区二区三区| 99国产精品白浆在线观看免费| 精品无吗乱吗av国产爱色| 国产一区二区网址| 国产高清在线不卡| 日本三级片在线观看| 久久免费精品视频在这里| 亚洲护士老师的毛茸茸最新章节| 天堂av在线8| 综合在线影院| 图片区小说区国产精品视频| 特级西西人体www高清大胆| 韩国三级av在线免费观看| 国产.欧美.日韩| 91香蕉亚洲精品| 天天天天天天天干| 免费永久网站黄欧美| 欧美美女操人视频| 黄色一级大片在线免费观看| 成人女性视频| 国产亚洲精品一区二555| 亚洲精品在线视频免费观看| 亚洲视频一起| 日韩午夜av一区| 亚洲网中文字幕| 欧美成人xxxx| 欧美日本高清视频在线观看| 激情内射人妻1区2区3区| 国产精品专区免费| 偷拍日韩校园综合在线| 国产夫妻自拍一区| 毛片大全在线观看| 一区二区三区不卡在线观看| 大桥未久一区二区三区| 黄a在线观看| 亚洲三级免费观看| 欧美少妇一区二区三区| 黄网页在线观看| 亚洲啪啪综合av一区二区三区| 在线丝袜欧美日韩制服| 麻豆最新免费在线视频| 日韩毛片视频在线看| 中文字幕综合在线观看| 黄色精品免费看| 亚洲综合成人在线视频| 香港三级日本三级a视频| 久久99亚洲网美利坚合众国| 亚洲韩国一区二区三区| 一本久道高清无码视频| 欧美男人天堂| 在线免费不卡视频| 我要看一级黄色大片| 成人在线免费av| 日韩一区二区三区精品视频| 色哟哟网站在线观看| 成人影院中文字幕| 亚洲精品在线91| 国产不卡在线观看视频| 亚洲成人精品| 久久久久久久国产精品视频| 伊人久久综合视频| 日韩制服丝袜av| 国产日韩在线观看av| 国产特级aaaaaa大片| www.久久精品| 婷婷五月色综合| 91三级在线| 欧美日韩性生活视频| 91极品视频在线观看| 激情综合婷婷| 精品视频偷偷看在线观看| 中文字幕人妻一区二区三区在线视频| 色777狠狠狠综合伊人| 色综合久久久888| 无码人妻丰满熟妇精品| 韩国女主播成人在线| 国产麻豆日韩| 在线视频婷婷| 亚洲电影在线播放| 日本久久久久久久久久久久| www.成人网| 中文字幕不卡在线视频极品| 精品深夜av无码一区二区老年| 久久av一区| 91超碰在线电影| 成人亚洲综合天堂| 亚洲国产日韩一区二区| 一区二区成人网| 嫩草国产精品入口| 久久综合88中文色鬼| 黄色在线免费观看| 国产成人小视频| 亚洲春色在线视频| 日本蜜桃在线观看视频| 欧美一级日韩一级| 日韩影视一区二区三区| 99精品视频免费观看视频| 国产欧美日韩丝袜精品一区| 午夜影院免费体验区| 亚洲精品菠萝久久久久久久| 99视频在线视频| 乱亲女h秽乱长久久久| 久久深夜福利免费观看| 在线免费观看av网址| 成人av免费在线| 蜜臀在线免费观看| 日韩国产大片| 伊人久久久久久久久久| 久久久久久久久久久久久av| 国产成a人亚洲| 热这里只有精品| 亚洲成人精品综合在线| 国产亚洲精品美女久久久久| 久久久久99精品成人片我成大片| 丁香天五香天堂综合| 午夜啪啪福利视频| 日本一区二区三区中文字幕| 一区二区三区动漫| 日韩欧美在线观看免费| 99久久婷婷国产精品综合| 男人天堂av片| 99这里只有精品视频| 久久中文字幕视频| 国产免费黄色网址| 亚洲三级久久久| 不卡中文字幕在线观看| 日韩av在线播放网址| 国产成人亚洲综合91精品| 三级视频在线播放| 欧美日韩一二三四五区| 亚洲av无码一区二区三区观看| 亚洲国产片色| 国产日韩欧美一区二区三区四区| 欧美14一18处毛片| 精品美女一区二区| 国产一级在线观看视频| 成人avav影音| 欧美三级一级片| 久久99国内| 国产精品成av人在线视午夜片| 国产福利免费在线观看| 欧美在线播放高清精品| 日日操免费视频| 国产揄拍国内精品对白| 欧洲金发美女大战黑人| 136国产福利精品导航网址应用| 久久99久久亚洲国产| 国产自产一区二区| 粉嫩老牛aⅴ一区二区三区| 久久久精品人妻无码专区| 日韩高清在线一区| 中文精品视频一区二区在线观看| 精品中文视频| 97在线观看免费| 欧美69xxxxx| 777a∨成人精品桃花网| 深夜福利影院在线观看| 99re成人在线| 奇米影音第四色| 欧美激情一级片一区二区| 国产精品入口免费| 欧美18av| 久久不射热爱视频精品| 懂色av成人一区二区三区| 日韩欧美在线播放| 97在线观看免费高| 成人国产一区二区三区精品| 国产性生交xxxxx免费| 综合一区av| 蜜桃传媒视频麻豆一区 | 欧美黑人巨大xxx极品| 亚洲三级中文字幕| 欧美理论片在线| 日本熟妇毛茸茸丰满| 中文字幕+乱码+中文字幕一区| 91香蕉视频免费看| 香蕉成人久久| 大陆极品少妇内射aaaaaa| 奇米狠狠一区二区三区| 91影院未满十八岁禁止入内| 深夜成人福利| 欧美精品videosex极品1| 国产一区二区影视| 精品成人免费观看| 91美女精品网站| 懂色aⅴ精品一区二区三区蜜月| 精品国产视频一区二区三区| 91蝌蚪porny九色| 成人在线短视频| 免费在线看成人av| av免费观看网| 黑人一区二区| 欧美日韩在线免费观看视频| 私拍精品福利视频在线一区| 亚洲影院污污.| 久久免费影院| 国产成人自拍视频在线观看| 182在线视频观看| 欧美乱妇高清无乱码| 亚洲视频tv| 国产一区二区三区在线视频| 天天操天天操天天操| 日韩欧美一二三| 91久久国语露脸精品国产高跟| 欧美性生交xxxxx久久久| 精品一级少妇久久久久久久| 亚洲欧美日韩国产手机在线| 九一在线免费观看| 久久九九国产精品| 免费看污黄网站在线观看| 懂色av噜噜一区二区三区av| 日本高清免费在线视频| 美女精品自拍一二三四| www.日日操| 丝袜美腿亚洲一区二区图片| 欧美日韩在线一| 亚洲免费精品| 成人午夜视频在线观看免费| 欧美日韩亚洲一区在线观看| 久久久久久久免费视频| 久久精品青草| 影音先锋男人的网站| 亚洲精品成人影院| 91手机视频在线| 亚洲成人一区| 色哺乳xxxxhd奶水米仓惠香| 婷婷激情综合| 激情视频小说图片| 欧美久色视频| 精品国产av无码一区二区三区| 欧美激情五月| 无码粉嫩虎白一线天在线观看 | 狠狠操综合网| 欧美一区激情视频在线观看| 国产一区二区亚洲| 亚洲欧洲免费无码| 婷婷久久国产对白刺激五月99| 国产精品无码乱伦| 国自产拍偷拍福利精品免费一 | 免费成人av资源网| 麻豆三级在线观看| 国产一区二区三区在线观看免费视频 | 国产精品一二三产区| 欧美亚洲在线播放| 深夜视频一区二区| 成人免费看吃奶视频网站| 精品一区二区三区中文字幕视频| 国产精品18毛片一区二区| 台湾亚洲精品一区二区tv| 欧美一区二区在线视频观看| 色乱码一区二区三区网站| 一区二区不卡在线| 国产精品va| 人妻内射一区二区在线视频| 毛片不卡一区二区| 在线观看你懂的视频| 91色综合久久久久婷婷| 成年人看的免费视频| 一区二区成人在线视频| 亚洲自拍一区在线观看| 欧美日本国产视频| 香蕉久久国产av一区二区| 亚洲一区二区久久| 天堂av最新在线| 欧美专区在线视频| 精品999日本久久久影院| 好看的日韩精品| 国产精品久久久久久| 国产 日韩 欧美在线| 免费美女久久99| xxxx视频在线观看| 国产精品美女久久久久久| 国产亚洲欧美久久久久| 欧美日韩在线播放三区四区| 国产91麻豆视频| 中文字幕不卡av| 国产中文在线播放| 成人性生交xxxxx网站| 在线成人动漫av| 精品人妻大屁股白浆无码| 久久精品道一区二区三区| 麻豆网站免费观看| 日本一区二区三区四区| 国产在线观看你懂的| 精品视频在线免费观看| 免费国产精品视频| 久久精品国产一区| 亚洲www啪成人一区二区| 动漫一区二区在线| 91日韩视频| 久久久久久香蕉| 99视频一区二区三区| 欧美特级一级片| 精品视频999| 精品影院一区| 91产国在线观看动作片喷水| 视频成人永久免费视频| 一本一道久久a久久精品综合| 国产精品一页| 日本一卡二卡在线| 亚洲综合无码一区二区| 91精品国产色综合久久不8| 国产亚洲激情在线| 偷拍自拍在线看| 狠狠色狠狠色综合人人| 欧美网站在线| 九九九久久久久久久| 日韩码欧中文字| 中文字幕在线播放不卡| 在线观看精品自拍私拍| 欧美人与性动交xxⅹxx| 欧美日韩在线精品| 性8sex亚洲区入口| 熟女人妻在线视频| 午夜精品久久久久久久99樱桃| 精品人妻伦一二三区久久| 久青草国产97香蕉在线视频| 色8久久久久| 一区二区在线观| 久久99国产精品免费网站| 免费黄色国产视频| 欧美日韩精品三区| 欧美jizzhd欧美| 成人有码在线播放| 欧美国产91| 国产xxx在线观看| 亚洲国产精品一区二区www在线| 欧美综合视频在线| 性亚洲最疯狂xxxx高清| 偷窥自拍亚洲色图精选| 成人一级片网站| 亚洲国产成人在线| 91福利在线观看视频| 久久亚洲国产精品成人av秋霞| 2019中文亚洲字幕| 97中文字幕在线| av高清久久久| 极品国产91在线网站| 这里精品视频免费| 91精品麻豆| www.av91| 久久这里都是精品| 在线观看中文字幕av| 欧美成人中文字幕| 精品人人人人| 成年人小视频网站| 亚洲人成在线观看一区二区| 亚洲精品成人电影| 国产91精品久久久久久久| 精品国产精品国产偷麻豆| 久久99爱视频| 亚洲精品国产第一综合99久久| 色wwwwww| 国产精品久久激情| 欧美不卡一区| 草草地址线路①屁屁影院成人| 欧美私模裸体表演在线观看| 国产一二三区在线观看| 国产女主播一区二区| 老司机久久99久久精品播放免费| 永久免费看mv网站入口| 亚洲二区中文字幕| 国产亚洲欧美日韩精品一区二区三区| 天天操天天干天天玩| 91视频xxxx| 国产xxxx在线观看| 日韩美女av在线免费观看| 亚洲综合激情在线| 国产在线观看无码免费视频| 91精品国产一区二区三区香蕉| 国产小视频自拍| 亚洲日本电影在线| 三区在线观看| 97免费资源站| 日韩av一区二区三区四区| 国产主播在线观看| 色一情一乱一区二区| 日日天天久久| 中文字幕55页| 欧美怡红院视频|