Quantcast
Channel: Bashタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 2867

シェルスクリプトで複数のファイルを同時にオープンして交互に読み取る

$
0
0

はじめに

解説することもない小ネタですが意外と見かけない気がするので。pasteコマンド相当のものを独自で実装したい場合とか、ファイルディスクリプタのサンプルとして

補足 pasteコマンドは POSIX で規定されていますが OpenWrt では組み込まれていなかったりします。

実装

pasteコマンドのように引数で引数で指定した2つのファイルを行ごとにタブ区切りで結合します。リダイレクト版の方がファイルディスクリプタを適切なタイミングで自動的に閉じてくれる(元に戻してくれる)ので個人的に好みです。

リダイレクト版

paste1.sh
#!/bin/shwhile :;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/shexec 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

Viewing all articles
Browse latest Browse all 2867

Trending Articles