fg – 停止/バックグラウンドのジョブをフォアグラウンドに戻す

フォアグラウンド/バックグラウンド

fg は、現在のシェルが管理しているジョブのうち指定したものをフォアグラウンドに切り替えるシェル組み込みコマンドです。
Ctrl+Z で一時停止したプロセスや & で起動したバックグラウンドジョブを前面に戻すときに使います。
実務では jobs で確認 → fg %N で対象を再開、の流れが定番です。

構文(Syntax)

# POSIX / Bash / Zsh(シェル組み込み)
fg [JOBSPEC]

# よく使うジョブ指定子(JOBSPEC)の例
%1     # ジョブ番号 1
%+     # カレントジョブ(直近に操作したもの)
%-     # 直前のカレントジョブ(次点)
%string    # コマンド行が string で始まるジョブ
%?string   # コマンド行に string を含むジョブ
  • JOBSPEC を省略すると カレントジョブ(%+ が対象になります。
  • 停止中ジョブは SIGCONT で再開され、端末を占有して前面で実行されます。

主なオプション一覧

fg 自体に一般的なオプションはありません(Bash/Zshともに引数はジョブ指定子のみ)。

オプション/引数説明使用例
(なし)カレントジョブを前面へfg
JOBSPEC=%Nジョブ番号 N を前面へfg %1
JOBSPEC=%+ / %-直近/次点のジョブを前面へfg %+
JOBSPEC=%stringコマンドが string で始まるジョブを特定fg %vim
JOBSPEC=%?stringコマンドに string を含むジョブを特定fg %?python

実行例

Ctrl+Z で停止 → bg で後ろへ → fg で前面へ

説明: エディタを一時停止し、後ろで走らせた後に前面へ戻します。
コマンド:

vim README.md
# (作業中に Ctrl+Z を押して停止)
bg          # バックグラウンドで再開
fg          # 前面へ戻す(省略時は %+ が対象)

複数ジョブのうち特定の番号を前面へ

説明: 2つの sleep を起動し、ジョブ番号で選んで前面にします。
コマンド:

sleep 100 &    # [1]
sleep 200 &    # [2]
jobs
fg %1          # ジョブ1を前面へ

文字列でジョブを特定して前面へ

説明: python を含むジョブを検索的に指定します。
コマンド:

python long_task.py &
make -j8 &
jobs
fg %?python

パイプラインの前段を停止してから復帰

説明: パイプ全体が1つのジョブです。前面に戻すと再び端末を占有します。
コマンド:

yes | pv -L 1m | gzip > out.gz
# Ctrl+Z で停止
bg                    # 裏で再開
fg                    # 再び前面へ(中断・再開の挙動確認)

エラー例:存在しないジョブを指定

説明: 既に終了したジョブ番号を指定するとエラーになります。
コマンド:

fg %9

出力例(例):

bash: fg: %9: no such job

関連コマンド

  • jobs : 現在のシェルが管理するジョブ一覧を表示。
  • bg : 停止中ジョブをバックグラウンドで再開。
  • kill : ジョブ/プロセスにシグナル送信(例: kill -STOP %1, kill -CONT %1)。
  • disown(Bash/Zsh) : ジョブをシェルの管理から外す(ログアウト後も継続させたい場合など)。
  • wait : 指定ジョブ/プロセスの終了を待つ。

備考

  • シェル組み込み: fg は外部コマンドではありません。現在のシェルに対してのみ効果があります(別端末・サブシェル・sudo シェルには影響しません)。
  • ジョブ制御が必要: 対話的シェルでジョブ制御が有効であること(Bashなら set -m が有効)。cronや非対話シェルでは通常使えません。
  • 端末占有: fg で前面にすると、そのジョブは端末(標準入力)を再び占有します。Ctrl+CSIGINT)、Ctrl+ZSIGTSTP)などの端末シグナルも前面ジョブが受けます。
  • Bash/Zsh の指定子: %+(カレント), %-(前のジョブ), %N, %string, %?string などのジョブ指定子が使えます。
  • 移植性: 基本仕様は POSIX fg に準拠しますが、ジョブ指定子の拡張や表示メッセージはシェルごとに差があります。

参考

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント