2026年9月15日 星期二

Boot to TTY or Graphic Mode in Ubuntu

1. 預設開機直接進入純文字模式 (CLI/TTY)

    sudo systemctl set-default multi-user.target

    sudo reboot

2. 預設開機直接進入圖形模式

    sudo systemctl set-default graphical.target

    sudo reboot

3. 檢查目前預設的啟動模式

    systemctl get-default

4. 不重啟電腦,立即從文字模式進入圖形介面

    sudo systemctl start gdm3

    (註:依據 Ubuntu 版本不同,顯示管理器也可能是 lightdm 或 sddm)

2026年9月14日 星期一

Ubuntu Login keyring password "no longer matches"

 

1.  Update via Seahorse

    a. run seahorse in a terminal.

    b. Look at the sidebar under Passwords and find the item named login.

    c. Right-click on login and select Change Password.

    d. Enter your old system password (the previous password before you changed it) when prompted for the current password.

    e. Enter your new current Ubuntu login password for the new password fields, then save.

 

2. Reset the Keyring (If old password is unknown) 

    a. Delete the login keyring file: ~/.local/share/keyrings/login.keyring 

    b. Log out

 

 

Shell(.sh)


1. 在終端機螢幕上顯示文字、變數內容,或將訊息輸出到檔案中

    echo "Hello World"

2. 定義變數

    <variable name>=<data>

規則:

    a. 等號前後,不能有空格

    b. 變數名稱只能是英文和數字,且數字不能在開頭 

    c. 變數內容,如需空白,可放在雙引號 "" 或是單引號 '' 裡面

        -雙引號中若有特殊字元,例如 $,會保有原本的特性

        -單引號中所有的字元即為一般字元,沒有任何功能 。

    d. 反斜線 \, 可以跳脫其後接的第一個字元本身的功能  

3.  取得變數內容

    $<variable name>
    ${<variable name>}

4. 指令內容,可以使用 $(command) 或是 `command` 取得其他指令的值。

    username=$(whoami)
    echo $username
    user 

5. 取消變數設定

    unset username

6. 取得所有環境變數

    env

7.  自訂變數轉成環境變數

    export <variable name> 

8.  查看目前開放哪些環境變數

    export

9.  列出所有的變數:自訂變數,環境變數,bash 本身變數

    set

10. 語系相關

    a. 查看目前語系變數:locale

    b. 查看支援哪些語系:locale -a 

    c. 暫時修改語系的變數:export LANG=zh_TW.utf8

        只要有設定 LANG 或是 LC_ALL,則其他的變數就會被這兩個變數自動取代。

    d. 永久修改語系的變數:打開 /etc/locale.conf, 加入或更改:LANG="en_US.utf-8"

11.  讀取鍵盤輸入,當作變數值

    read <option> <variable name>

    option :
        -a : array,變數為陣列格式,以空白隔開,依序存入陣列中,索引從0開始。
        -p : prompt,跳出提示字串。
        -t : timeout,設定秒數內沒有完成則結束。 

12. 宣告變數的類型,沒指定,預設為字串。只有整數才可運算。 

    declare <option> <variable name>

    option :
        -a : 變數為陣列格式,以空白隔開,依序存入陣列中,索引從0開始。
        -i : 整數類型,可以進行數值運算,但是預設只能做到整數型態。
        -l : 將變數內容轉換為小寫。
        -r : 變數僅為 readonly,不可被更改也不可以被 unset。
        -u : 將變數內容轉換為大寫。
        -x : 開放變數轉換成環境變數,等同使用 export。

 

13. 比較符號:

    字串比較符號:
        =:等於(字串相等)
        !=:不等於(字串不相等)
        <:小於(按字典序比較)
        >:大於(按字典序比較)
        -z:檢查字串是否為空(長度為零)
        -n:檢查字串是否非空(長度大於零)

    數字比較符

        -eq:等於(數字相等)
        -ne:不等於(數字不相等)
        -lt:小於(數字小於)
        -le:小於或等於(數字小於或等於)
        -gt:大於(數字大於)
        -ge:大於或等於(數字大於或等於)

14. 檔案測試符號: 

    -e FILE:如果 FILE 存在,則為真。
    -f FILE:如果 FILE 存在且為一個檔案,則為真。
    -d FILE:如果 FILE 存在且為一個目錄,則為真。
    -s FILE:如果 FILE 存在且檔案大小不為零,則為真。
    -r FILE:如果 FILE 存在且可讀取(有讀取權限),則為真。
    -w FILE:如果 FILE 存在且可寫入(有寫入權限),則為真。
    -x FILE:如果 FILE 存在且可執行(有執行權限),則為真。
    -L FILE:如果 FILE 存在且為一個符號連結(軟連結),則為真。
    -p FILE:如果 FILE 存在且為一個命名管道(FIFO),則為真。
    -c FILE:如果 FILE 存在且為一個字元特殊文件,則為真。 

15. 流程控制:

    a. if, then else fi 

        if 條件
        then
            # 如果條件為True,執行這裡的命令
        else
            # 如果條件為False,執行這裡的命令
        fi

    b. if … elif … fi

        if 條件1
        then
            # 如果條件1為真,執行這裡的命令
        elif 條件2
        then
            # 如果條件2為真,執行這裡的命令
        else
            # 如果以上所有條件都不滿足,執行這裡的命令
        fi

    c.  case

        case 值 in
            條件1)
                    條件1匹配時執行的命令

                    ;;
            條件2)
                    條件2匹配時執行的命令

                    ;; 
            *)

                    沒有任何匹配時執行的命令

                    ;;
        esac

    d. for

        for 變數 in 列表; do
            執行的命令
        done

    e. while

        while 條件
            do
                # 當條件為真時執行的程式碼
        done

16. 函式(Function)結構: 

    function 函式名稱 {
        # 函式的程式碼
        # 可以使用傳遞給函式的參數
        # 函式的操作
        # ...
        # 返回值(可選)
    }

 

17. 結果輸出導向: 

    a. >(複寫導向

        echo "Hello" > output.txt

    b. >>(附加導向將指令的標準輸出以附加(Append)的方式存入檔案。它不會刪除舊資料,而是將新資料寫在檔案的最末端。

        echo "Hello" >> output.txt

    c. &>(全輸出導向):標準輸出(stdout)和標準錯誤輸出(stderr)「同時」存入同一個檔案中。無論指令執行成功還是發生錯誤,所有的訊息都會被寫進檔案(並採覆寫模式)。&> 與較傳統的寫法 > 檔案名稱 2>&1 效果完全相同。)

        echo "Hello" &> output.txt

    d. 2>&1 將標準錯誤輸出(stderr,代號 2)重新導向至標準輸出(stdout,代號 1)

        在 Linux 與 Bash 中,每個執行中的程式都有預設的資料流代號: 

            0:標準輸入(stdin,鍵盤輸入)

            1:標準輸出(stdout,正常顯示的訊息)

            2:標準錯誤(stderr,錯誤或警告訊息) 

 

18. 管線命令 (pipe):管線命令使用『 | 』,上一個指令輸出,給下一個指令使用。
    例:ls -al /etc | less
    ls 指令輸出後的內容,給 less 讀取

  

  

19. Shell Script基本結構元素:

    1. Shebang行:通常以#! 開頭後面接著一個解釋器(interpreter)的路徑,用來告訴系統使用哪種shell來執行script,系統會自動使用指定的解釋器執行script。

        #!/bin/bash

    2. 註釋:使用 # 符號來添加註釋。註釋不會被執行僅供備註閱讀。

        # 這是一個註釋

    3. 變數

        variable="Hello World!"

    4. 特殊變數

        $0, ${BASH_SOURCE[0]}:這個變數代表目前shellscript程式的檔案名稱(包括路徑)。

         $1, $2, ... $n:用於獲取命令行參數傳遞給程式的值。$1代表第一個參數,$2代表第二個參數,依此類推,$n代表第n個參數。

    5.  特殊的環境變數

        $HOME:代表當前的主目錄路徑,通常用於訪問家目錄。
        $USER:代表當前使用者名。
        $PWD:代表當前工作目錄的路徑。
        $SHELL:代表當前所使用的Shell的路徑。
        $PATH:包含了Shell用於查詢可執行命令的目錄列表。

    6. 指令:

        echo "This is a shell script."

    7. 流程控制:(如 if、else、case)和迴圈(如 for、while)來執行流程控制
        if [ $age -ge 18 ]; then
            echo "You are an adult."
        else
            echo "You are not yet an adult."
        fi

    8. 函數:函數能夠接受參數與返回值。

        function afunc {
            echo "Hello, $1!"
        }
        afunc "Alice"

 

 參考網站:

    Shell 的變數設定 

    Shell Script 基礎介紹 

 

 

2026年8月25日 星期二

Format USB flash drive in Ubuntu

 1. 查詢磁碟位置與資訊(判斷正確位置)

    指令: lsblk

2. Un-mount磁碟,避免運作中

    sudo umount /dev/sda1(sda1為一個例子,要看實際位置,參考lsblk)

3. 格式化磁碟

    exFAT格式:sudo mkfs.exfat /dev/sda1(跨 Windows/Mac/Linux,支援大於 4GB 檔案)

                          sudo exfatlabel /dev/sda1 "NewDiskName"(修改磁碟名稱)

    FAT32格式:sudo mkfs.vfat /dev/sda1 (相容性最高,但單一檔案不能大於 4GB)

                          sudo mlabel -i /dev/sda1 ::"NewDiskName"(修改磁碟名稱)

    NTFS格式:sudo mkfs.ntfs /dev/sda1  (Windows 系統常用)

                          sudo ntfslabel /dev/sda1 "NewDiskName"(修改磁碟名稱)

    ext4格式   :sudo mkfs.ext4 /dev/sda1 (Linux 專用格式)

                          sudo e2label /dev/sdda1 "NewDiskName"(修改磁碟名稱)

    P.S. 如果找不到,安裝格式化程式:sudo apt install exfatprogs


磁碟相關指令:

lsblk(List Block Devices)

blkid(Block Identification)

mount

umount

fdisk -l(Fixed Disk or Format Disk)

df -h(Disk Free)


2026年8月24日 星期一

Visual Studio Code(C/C++ Auto Format)

C/C++ Auto Format

1. File --> Preferences-->Settings

2. Extensions-->C/C++-->Formatting

3. C_Cpp: Clang_format_fallback Style

4. Sample: {BasedOnStyle: LLVM, BreakBeforeBraces: Linux, SpaceBeforeParens: Never, AllowShortIfStatementsOnASingleLine: true, MaxEmptyLinesToKeep: 8, ColumnLimit: 0, UseTab: Always, IndentWidth: 4, TabWidth: 4}


Tab(Keep tab, Don't change to space key)

1. File --> Preferences-->Settings

2. Search: "Insert Spaces"

3. UnCheck:

        Editor: Insert Spaces

        Editor Detect Indentation

2026年8月11日 星期二

xrandr (Linux 多螢幕控制)

 

xrandr指令:

    X Resize and Rotate 的縮寫,X:代表 X 視窗系統(X Window System)。

    官方原始碼由 X.Org 專案維護。X.Org 官方網站X.Org XRandR 說明頁面

    執行 xrandr --help查詢說明,主要使用--output後面相對參數。    

    指令介紹(包含:xrandr, cvt(Coordinated Video timing)):

        https://wiki.archlinuxcn.org/zh-tw/Xrandr

    圖形版:

        https://wiki.archlinuxcn.org/zh-tw/Xrandr


    多螢幕設定:

        左右延伸螢幕:將 DP-1 放的右側

            xrandr --output DP-0 --auto --output DP-1 --auto --right-of DP-0

        上下延伸螢幕:將DP-1放下方

            xrandr --output DP-0 --auto --output DP-1 --auto --below DP-0

        設定主螢幕(包含釘選工作列的位置)

            xrandr --output DP-0 --primary

        複製螢幕(鏡像同步):讓兩個螢幕顯示相同畫面

            xrandr --output DP-0 --auto --output DP-1 --auto --same-as DP-0

        關閉特定螢幕:關閉 DP-0 輸出:

            xrandr --output DP-0 --off


Ref:

    https://yowlab.idv.tw/wordpress/?p=1337