2008/10/15

讓 bash script 具多重檔案的輸入

bash redirecting input multiple files一文提到怎樣讓你的 shell script 能夠同時由標準輸入轉向讀多個檔,簡單講就是像:

#!/bin/bash

while read f1 <&7
do
read f2 <&8
echo $f1 $f2
done \
7<$1 \
8<$2


這寫法有幾點可以提出來談:
一、 while 那行尾部的 <&7 及 <&8 這種寫法,是把 file handler 轉向輸入,若你會寫 C/C++ 的話,可以用 fileno(FILE*) 來取得 file handler, 是個整數,沒錯,就是這邊的 7, 8 的意思。(註: 或由低階函數 open() 所傳回的也是此 file handler)
二、檔案後面二行的 7<$1 及 8<$2 是把命令參數第一個當 file handler 7, 第二個參數當 file handler 8。因此搭配第一點就變成: 把第一個參數的檔由 f1 讀,而第二個參數的檔由 f2 讀
三、這種寫法適用範圍不多,因此少有人提,若不是像文中所提要拿來比較(或逐行並列)的話,比較常見的用法是把多個檔一行一行讀進來,那很簡單只需要用 cat File1 File2 | YOUR_SCRIPT 的方式即可。

0 意見: