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  9月  3 15:46 .
    drwxr-xr-x 10 root root 4096  2月  4  2020 ..
    lrwxrwxrwx  1 root root   52  9月  3 15:02 node -> /home/daniel/daniel/node-v12.18.3-linux-x64/bin/node
    lrwxrwxrwx  1 root root   51  9月  3 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。
參考資料 :

0 意見:

張貼留言

Popular Posts