Lから始まるLinux

2章46話
プロセス置換
2章47話 グルーピング
もくじ
2章48話
同一ファイルへの入出力
グルーピング
若木 しげる
今回はコマンドを束ねる 「グルーピング(grouping)」を学ぼう!
若木 みどり
コマンドを束ねる? どうやって使うのかな?
{ ... } によるグルーピング
若木 しげる
最初は { ... } での グルーピングだよ 書き方はこうだよ
{
  コマンド1
  コマンド2
  ...
}
若木 みどり
ただまとめるだけ?動きには何か変化があるのかな?
若木 しげる
まとめるだけだと何も変わらないけど他の機能と組み合わせて力を発揮するんだ例えばバックグラウンド実行と組み合わせてみよう
{
  echo "ファイルをダウンロード中…"
  sleep 10
  echo "完了!"
} &
若木 しげる
ダウンロードはsleep で代用しているよ
若木 しげる
このように複数のコマンドを1つのまとまりとしてバックグラウンド実行できるんだ!
若木 みどり(驚き)
便利だね!1行で書ききれなかったらグルーピングを使うよ!
若木 しげる
もう一つよく使われるのはリダイレクトだよグループ全体の出力をまとめてリダイレクトできるんだ例えば以下は警告メッセージを標準エラー出力として表示するよ
{
  echo "============"
  echo "!!警告!!"
  echo "============"
} >&2
若木 みどり(笑顔)
全体を一括してリダイレクトできるんだね!
( ... ) によるグルーピング
若木 しげる
似たようなものに( ... ) があるんだ書き方は以下のとおりだよ
(
  コマンド1
  コマンド2
  ...
)
若木 みどり
これもグルーピングなんだね{ ... } とどう違うのかな?
若木 しげる
( ... ) の中は元のシェルではなく「サブシェル(sub shell)」という別のシェル環境で実行されるんだ
若木 みどり
サブシェル?わざわざ別のシェルで実行する理由がよくわからないな…
若木 しげる
サブシェルで行った操作は元のシェルに影響を与えないんだそのことを利用してこんなことができるよ
(
  cd /tmp
  echo "$(pwd) ディレクトリで操作をするよ!"
)
echo "操作が終わった後、現在のディレクトリは $(pwd)"
若木 しげる
これはサブシェルで /tmp へ移動してそこでコマンドを実行しているけど元のシェルはディレクトリ移動の影響を受けていないんだ
/tmp ディレクトリで操作をするよ!
操作が終わった後、現在のディレクトリは /home/midori
若木 みどり(驚き)
へぇー…確かに現在のシェルのディレクトリを変えずに別ディレクトリで作業をできるのは便利かも!
まとめ
若木 みどり
今回はグルーピングを学んだよ!{ ... }( ... )用途が違うんだね!
若木 しげる
そのとおりだね!それぞれの特徴を意識して使い分けることが大事だよ