Bash スクリプト内でターミナルウィンドウのサイズを取得する

Bash スクリプト内で、ターミナルウィンドウのサイズを取得し、ウィンドウサイズの変更を監視する方法があった。

#!/usr/bin/env bash

declare -x rows cols  # 環境変数として定義する (`export` もされている)
function on_winch() {
  rows="$(tput lines)" # ${LINES}
  cols="$(tput cols)"  # ${COLUMNS}
  
  # ウィンドウサイズが変わった時にココでなにか処理する
  echo "[DEBUG] On WinCh : ${rows} lines X ${cols} columns"
}
trap on_winch WINCH

こんな風に、trap というコマンドを使うと、JavaScript でいう window.addEventListener() みたいなことができる。

ウィンドウサイズは tput コマンドで取得しているが、Bash の組み込み変数に ${LINES}${COLUMNS} というモノもあって、コチラでも同値が取れた。

ついでに、ウィンドウを指定のサイズにリサイズする printf 特殊文字も見つけたのだが、MacOS の Terminal.app では動作して、VSCode 内のターミナルでは動作しない、といった感じ。まぁそりゃそうか。w

# ウィンドウサイズを 50 Lines × 100 Columns に変更する
printf '\033[8;50;100t'

ついでに、今まで自分は #!/bin/bash と Shebang を書いていたのだが、#!/usr/bin/env bash の方がよりポータブルだと書かれていて確かに〜〜と思ったので、今後はコチラの Shebang に変えていこうと思う。