1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-03-08

はじめに

解説することもない小ネタですが意外と見かけない気がするので。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
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?