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

Makefile 筆記 (2)

Makefile 範本 (OS: Linux)

    這個 Makefile 有結合 .c 跟 .cpp 檔案, 並且使用一些字串處理 function。
    # gcc compiler 參數
    CC      := gcc
    CFLAGS  := -g -Wall -Werror -std=c99
    # g++ compiler 參數
    CXX     := g++
    CXXFLAG := -Wall -Werror -std=c++17


    # 宣告 source 資料夾
    SRC_DIRS = ./source
    # 把 source 資料夾裡的 cpp 跟 c 全部找出來
    SRCS := $(shell find $(SRC_DIRS) -name "*.cpp" -or -name "*.c")
    # 取檔名並把副檔名加上 .o
    OBJS := $(addsuffix .o,$(notdir $(SRCS))) main.o

    # include 參數 (適用於多個 include 資料夾, 成果會是 gcc -I/dir1 I/dir2)
    INC_DIRS  := ./include 
    INC_FLAGS := $(addprefix -I,$(INC_DIRS))

    all: program

    program: $(OBJS)
        $(CXX) $(CXXFLAG) $(OBJS) -o $@ 

    main.o: main.cpp
        $(CXX) $(INC_FLAGS) $(CXXFLAG) -c $< -o $@

    # .cpp.o 找 .cpp 編譯
    %.cpp.o: $(SRC_DIRS)/%.cpp
        $(CXX) $(INC_FLAGS) $(CXXFLAG) -c $< -o $@

    # .c.o 找 .c 編譯
    %.c.o: $(SRC_DIRS)/%.c
        $(CC)  $(INC_FLAGS) $(CFLAGS) -c $< -o $@

    .PHONY: clean

    clean:
        rm -rf ${OBJS} program
相關文章 :

Popular Posts