2020年9月3日 星期四

Linux - Shell Scripts - ln 指令

ln 指令

    ln 指令是用來建立連結檔, 這裡用安裝 nodejs 示範。安裝法為在官網下載編譯好的 nodejs, 然後用 ln 建立連結檔。
    # 從 nodejs.org 下載並解壓縮至 /home/user/software
    $ ln -s /home/daniel/software/node-v12.18.3-linux-x64/bin/node /usr/local/bin/
    $ ln -s /home/daniel/software/node-v12.18.3-linux-x64/bin/npm  /usr/local/bin/
    # 之後利用 node -v 跟 npm -v 來確定安裝是否完成...
    
    daniel@daniel-pc:~/daniel/node-v12.18.3-linux-x64$ ls -al /usr/local/bin/
    總計 8
    drwxr-xr-x  2 root root 4096  93 15:46 .
    drwxr-xr-x 10 root root 4096  24  2020 ..
    lrwxrwxrwx  1 root root   52  93 15:02 node -> /home/daniel/daniel/node-v12.18.3-linux-x64/bin/node
    lrwxrwxrwx  1 root root   51  93 15:46 npm -> /home/daniel/daniel/node-v12.18.3-linux-x64/bin/npm

軟連結(soft/symbolic link) 跟 硬連結(hard link)

    上面範例我用的是軟連結, 指令有加 -s, 硬連結則是不加。下面是兩種連結的比較。
    連結 : 與連結的檔案相同的 inode, 相對路徑不受連結之檔案影響
    連結 : 與連結的檔案不同的 inode, 相對路徑連結之檔案影響
    如果用相對路徑去軟連結, 結果就是 2 個連結檔壞掉, 因為 inode 不同, 軟連結找不到 ./bin/node 跟 ./bin/npm。
    $ sudo ln -s ./bin/node /usr/local/bin/
    $ sudo ln -s ./bin/npm  /usr/local/bin/
    $ ls -al /usr/local/bin/
    總計 8
    drwxr-xr-x  2 root root 4096  9月  3 18:16 .
    drwxr-xr-x 10 root root 4096  2月  4  2020 ..
    lrwxrwxrwx  1 root root   10  9月  3 18:16 node -> ./bin/node
    lrwxrwxrwx  1 root root    9  9月  3 18:16 npm -> ./bin/npm
    如果用相對路徑去硬連結, 因為 inode 相同, 硬連結找得到 ./bin/node。
    $ sudo ln ./bin/node /usr/local/bin/
    $ sudo ln ./bin/npm  /usr/local/bin/
    $ ls -al /usr/local/bin/
    總計 47520
    drwxr-xr-x  2 root   root       4096  9月  3 18:24 .
    drwxr-xr-x 10 root   root       4096  2月  4  2020 ..
    -rwxr-xr-x  2 daniel daniel 48646656  7月 22 23:00 node
    lrwxrwxrwx  2 daniel daniel       38  9月  3 13:34 npm -> ../lib/node_modules/npm/bin/npm-cli.js
    但上面的 npm 是壞的, 因為原本的 npm 也是連結檔, 而且連的是相對位置。雖然透過 inode 找到該連結檔, 但因為是在 /usr/local/bin 下找相對位置所以找不到。所以就如同文章最一開始的安裝示範, 軟連結在相對路徑的處理上會受所連結檔案影響, 反而能成功找到 ../lib/node_modules/npm/bin/npm-cli.js。
參考資料 :

Related Posts:

  • Linux - Shell Scripts (1)sh v.s source     如果直接用 sh 執行 script,基本上就是開一個子程序去執行 script。所以父程序要獲得子程序的結果,通常都是靠著 export 解決 scope 的不同。若是使用 source 去執行 script,則是直接用本身程序去執行,所以本身與腳本享有共同 scope。更多請參考 : 鳥哥私房菜。 基本的 variable & operator    … Read More
  • Linux 初學 (1) Linux是一個作業系統      相較其他作業系統特殊的地方就是 Linux 為 GPL 授權軟體,Open source 的一種。使用者可以免費下載使用且隨意更改原始碼,只要你不修改其 GPL 授權或販賣簡單軟體 ( 簡單軟體指得是 Linux 上開發的軟體,但開發商還是能販售所謂的"服務" )。 Virtual Box 安裝 Linux      基本上我是照著&nbs… Read More
  • Linux - Shell Scripts (2)sh vs bash     我有時候用 sh 會讓 shell script 執行不過,通常會報 Bad substitution 之類的錯誤。其實是因為我用 ubuntu,ubuntu 的 sh 其實是指到 dash 而非 bash。dash 在這不作多介紹, 把它想像成輕量型的 bash,所以支援的功能有限,所以有機會報錯。 ubuntu: cd /bin/ ubuntu: /bin$ ls -l lrwxrwxrwx … Read More
  • Linux 初學 (2) Linux 指令查詢      Linux 指令有很多,使用者不可能全部記下來,所以查詢指令就很重要了。 man // 提供一般的查詢,支援度高 info // 提供閱讀介面較好的查詢 /usr/share/doc // 通常會把指令相關文件放在這 Linux 檔案權限 ls -al // l = 列出所有資訊,a … Read More
  • Linux 初學 (3) Linux 檔案系統     Linux 採用 FHS ( Filesystem Hierarchy Standard ),基本上規定三項 /        : 與開機系統有關 /usr   : 與軟體安裝 / 執行有關 /var   : 與系統運作過程有… Read More

0 意見:

張貼留言

Popular Posts