はじめに

こんにちは!今回はtputコマンドについて解説します。

tputは、ターミナルの属性や機能を制御するコマンドです。色の変更、カーソル位置の移動、テキストの装飾など、ターミナルを自由に操作できます。

シェルスクリプトで見栄えのいい出力を作りたい時に、めっちゃ活躍しますよ。

tputコマンドとは

tputは、terminfoデータベースを参照してターミナル制御シーケンスを実行する外部コマンドです。

主な機能:

  1. 色の制御 - 前景色・背景色の設定
  2. テキスト装飾 - 太字、下線、反転表示など
  3. カーソル制御 - カーソル位置の移動、行の消去
  4. ターミナル情報取得 - 画面サイズ、色数の確認
  5. ビープ音 - アラート音の出力

スクリプトで色付きの出力をするには必須のコマンドです。

基本構文

1
tput [オプション] [capname] [パラメータ...]

capnameはターミナルの機能名(capabilities)です。

主なオプション

オプション 説明
bold 太字
underline 下線
blink 点滅
reverse 反転表示(背景と文字の色を反転)
smul 下線開始
rmul 下線終了
setaf [1-7] 前景色設定(1:赤、2:緑、3:黄、4:青、5:紫、6:シアン、7:白)
setab [1-7] 背景色設定
cup X Y カーソルを(X,Y)に移動
home カーソルをホーム位置(左上)に移動
clear 画面をクリア
el 行末まで消去
cols 画面幅を取得
lines 画面高さを取得
colors 色数を取得
bel ビープ音を出す
reset ターミナルをリセット

使用例

例1: テキストを赤色で表示

1
2
3
tput setaf 1
echo "これは赤色のテキストです"
tput sgr0

実行結果:

1
これは赤色のテキストです(赤色で表示)

setaf 1で赤色を設定。sgr0で属性をリセットします。

例2: テキストを太字で表示

1
2
3
tput bold
echo "これは太字のテキストです"
tput sgr0

実行結果:

1
これは太字のテキストです(太字で表示)

boldで太字。sgr0でリセット。

例3: 色付きメッセージ関数

1
2
3
4
5
6
error() {
    tput setaf 1  # 赤色
    echo "エラー: $*"
    tput sgr0     # リセット
}
error "ファイルが見つかりません"

実行結果:

1
エラー: ファイルが見つかりません(赤色で表示)

よく使うパターンを関数化。

例4: 画面をクリアしてカーソルをホームに

1
tput clear

実行結果:

1
(画面がクリアされる)

clearコマンドと同じ効果。

例5: ターミナルの幅と高さを取得

1
2
3
cols=$(tput cols)
lines=$(tput lines)
echo "ターミナルサイズ: ${cols}x${lines}"

実行結果:

1
ターミナルサイズ: 80x24

画面サイズをスクリプトで取得。

例6: 背景色付きテキスト

1
2
3
4
tput setab 4  # 青い背景
tput setaf 7  # 白いテキスト
echo "これは青背景に白テキスト"
tput sgr0

実行結果:

1
これは青背景に白テキスト(青背景に白テキスト)

背景と前景色を組み合わせ。

例7: ビープ音を出す

1
tput bel

実行結果:

1
(ビープ音が鳴る)

アラート音。

例8: プログレスバー

1
2
3
4
5
6
7
for i in {1..10}; do
    tput setaf 2  # 緑色
    printf "#"
    sleep 0.1
done
echo ""
tput sgr0

実行結果:

1
##########(緑色で表示)

シンプルなプログレスバー表示。

例9: 複数の装飾を組み合わせ

1
2
3
4
tput bold
tput setaf 3  # 黄色
echo "注意: これは重要なメッセージです"
tput sgr0

実行結果:

1
注意: これは重要なメッセージです(太字・黄色で表示)

太字と色を同時に適用。

例10: 色数を確認

1
2
colors=$(tput colors)
echo "サポートしている色数: $colors"

実行結果:

1
サポートしている色数: 256

ターミナルの色対応状況を確認。

Tips・注意点

sgr0でリセットは必須

1
2
3
4
tput setaf 1
echo "赤色"
tput sgr0  # これがないと後続がすべて赤色に
echo "デフォルト色"

sgr0(Set Graphics Rendition 0)で必ずリセットします。

色番号の対応

1
2
3
4
5
6
7
8
9
# ANSI色コード
tput setaf 1  # 赤
tput setaf 2  # 緑
tput setaf 3  # 黄
tput setaf 4  # 青
tput setaf 5  # 紫
tput setaf 6  # シアン
tput setaf 7  # 白
tput setaf 0  # 黒

色番号は ANSI標準に従います。

-Tオプションでターミナルタイプ指定

1
tput -T xterm setaf 1

異なるターミナルで動作させたい場合に指定。

実践的な使い方

ログ出力に色をつける

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
info() {
    tput setaf 2
    echo "[INFO] $*"
    tput sgr0
}
warn() {
    tput setaf 3
    echo "[WARN] $*"
    tput sgr0
}
error() {
    tput setaf 1
    echo "[ERROR] $*"
    tput sgr0
}

info "処理開始"
warn "注意してください"
error "エラーが発生しました"

ログレベル別に色を分けて表示。

インタラクティブなスクリプト

1
2
3
4
5
6
7
tput clear
tput bold
tput setaf 4
echo "============================================"
echo "       システムセットアップウィザード"
echo "============================================"
tput sgr0

UIっぽい出力を作成。

画面サイズに応じた出力

1
2
3
4
5
6
cols=$(tput cols)
if [ $cols -lt 80 ]; then
    echo "画面が狭すぎます"
else
    echo "正常に表示します"
fi

ターミナルサイズをチェック。

まとめ

tputコマンドのポイント:

  • ターミナル制御を行うコマンド
  • 色設定: tput setaf [1-7](前景色)、tput setab [1-7](背景色)
  • テキスト装飾: bold(太字)、underline(下線)など
  • カーソル制御: cup X Y(移動)、home(ホーム)
  • 情報取得: cols(幅)、lines(高さ)、colors(色数)
  • 必ずリセット: tput sgr0で属性をリセット
  • よく使う組み合わせ: tput setaf 1; echo "text"; tput sgr0

シェルスクリプトで見栄えのいい出力を作りたい時に最強のコマンドですよ!