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。
參考資料 :