Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

Shell 同時讀取多個檔案:檔案描述符進階應用教學

編輯:Linux 教學

單一檔案讀取回顧

# 方式 1:for 迴圈 (不推薦大檔案)
for line in $(cat "$file"); do echo "$line"; done

# 方式 2:while read + 重導向 (標準做法)
while read line; do echo "$line"; done < "$file"

核心概念:檔案描述符

Bash 預設三個描述符:

  • 0 - stdin (標準輸入)
  • 1 - stdout (標準輸出)
  • 2 - stderr (標準錯誤)

我們可用 exec 開啟額外描述符 (3-255) 綁定檔案:

exec 7< file1    # 以唯讀開啟 file1 綁定 fd 7
exec 8< file2    # 以唯讀開啟 file2 綁定 fd 8

讀取語法

read data <&7   # 從 fd 7 讀一行到變數 data
read data <&8   # 從 fd 8 讀一行

注意:<& 前的 & 告訴 shell 後面是描述符編號而非檔名。

關閉描述符

exec 7</dev/null
exec 8</dev/null

完整範例:同步逐行讀取兩檔案

readfiles() {
    local FD1=7 FD2=8
    local file1=$1 file2=$2
    local count1=0 count2=0 eof1=0 eof2=0
    local data1 data2

    exec 7<"$file1"
    exec 8<"$file2"

    while [[ $eof1 -eq 0 || $eof2 -eq 0 ]]; do
        if read data1 <&$FD1; then
            let count1++
            printf "%s, line %d: %s\n" "$file1" $count1 "$data1"
        else
            eof1=1
        fi

        if read data2 <&$FD2; then
            let count2++
            printf "%s, line %d: %s\n" "$file2" $count2 "$data2"
        else
            eof2=1
        fi
    done

    exec 7</dev/null
    exec 8</dev/null
}

# 使用
readfiles file1.txt file2.txt

應用場景

  • 對比兩份日誌/設定檔差異
  • 合併處理多欄位資料來源
  • 平行處理多串流資料
Copyright © Windows教程網 All Rights Reserved