はじめに
解説することもない小ネタですが意外と見かけない気がするので。paste
コマンド相当のものを独自で実装したい場合とか、ファイルディスクリプタのサンプルとして
補足 paste
コマンドは POSIX で規定されていますが OpenWrt では組み込まれていなかったりします。
実装
paste
コマンドのように引数で引数で指定した2つのファイルを行ごとにタブ区切りで結合します。リダイレクト版の方がファイルディスクリプタを適切なタイミングで自動的に閉じてくれる(元に戻してくれる)ので個人的に好みです。
リダイレクト版
paste1.sh
#!/bin/sh
while :; do
eof=1
read -r line1 <&3 && eof=''
read -r line2 <&4 && eof=''
[ "$eof" ] && break
printf '%s\t%s\n' "$line1" "$line2"
done 3<"$1" 4<"$2"
exec 版
paste2.sh
#!/bin/sh
exec 3<"$1" 4<"$2" # ファイルディスクリプタを開く
while :; do
eof=1
read -r line1 <&3 && eof=''
read -r line2 <&4 && eof=''
[ "$eof" ] && break
printf '%s\t%s\n' "$line1" "$line2"
done
exec 3<&- 4<&- # ファイルディスクリプタを閉じる
# 開いているファイルディスクリプタを調べる方法
# ls -al /proc/$$/fd