■コマンドのグループ化
複数のコマンドを実行し、まとめて一つのファイルに出力(リダイレクト)する場合、別々にコマンドを実行し、ファイルに出力する方法と、{ }を使用し、グルーピングしてコマンドを実行する方法がある。
▼実行するプログラムの概要
①日付をログファイルに出力する。
②「/work/tmpのディレクトリ情報」の文言をログファイルに出力する。
③ /work/tmpのディレクトリ情報を出力する。
参考:/work/tmpのディレクトリ階層イメージ
▼ 別々にコマンドを実行する
・サンプルコード
#!/bin/bash
# 別々にコマンドを実行する
# 日付をログファイルに出力する
date +%Y%m%d >> logfile1.log
# 文言をログファイルに出力する
echo '/work/tmpのディレクトリ情報' >> logfile1.log
# /work/tmpのディレクトリ情報を出力する
ls /work/tmp >> logfile1.log
・実行結果
「logfile1.log」の中身を確認
20220305
/work/tmpのディレクトリ情報
aa.txt
bb.txt
cc.txt
▼グルーピングしてコマンドを実行する(複数行パターン)
・サンプルコード
#!/bin/bash
# グルーピングしてコマンドを実行する(複数行パターン)
{
date +%Y%m%d
echo '/work/tmpのディレクトリ情報'
ls /work/tmp
} >> logfile2.log
・実行結果
「logfile2.log」の中身を確認
20220305
/work/tmpのディレクトリ情報
aa.txt
bb.txt
cc.txt
▼グルーピングしてコマンドを実行する(1行パターン)
・サンプルコード
#!/bin/bash
# グルーピングしてコマンドを実行する(1行パターン)
{ date +%Y%m%d; echo '/work/tmpのディレクトリ情報'; ls /work/tmp; } >> logfile3.log
・実行結果
「logfile3.log」の中身を確認
20220305
/work/tmpのディレクトリ情報
aa.txt
bb.txt
cc.txt
■サブシェルを使用したグループ化
前項で複数のコマンドをグループ化する際は、{ }を使用したが、( )を使用する方法もある。
なお、( )内の処理はサブシェル内で実行される。
サブシェルとは、実行しているシェル[親プロセス]から子プロセスを起動する。
子プロセスを起動されることにより、( ) 内の処理は親プロセスに影響は与えない。
▼実行するプログラム概要
○:親プロセスの処理番号
( ):サブシェルの処理番号
①/workディレクトリに移動
②カレントディレクトリをログ出力
③変数に「aaa」をセット
④変数に格納した値を出力
(1)カレントディレクトリを出力
(2)/work/tmpディレクトリに移動
(3)カレントディレクトリを出力
(4)変数に格納した値を出力
(5)変数に「bbb」に変更
(6)変数に格納した値を出力
⑤カレントディレクトリを出力
⑥変数に格納した値を出力
参考:データ遷移
表より、サブシェルの値を変更しても、親プロセスの値は変わらない。
▼サンプルコード
#!/bin/bash
# /workディレクトリに移動
cd /work
# カレントディレクトリを出力
pwd >> logfile4.log
# 変数に「aaa」をセット
name='aaa'
# 変数に格納した値を出力
echo $name >> logfile4.log
(
echo 'サブシェル起動'
# カレントディレクトリを出力
pwd
# /work/tmpディレクトリに移動
cd /work/tmp
# カレントディレクトリを出力
pwd
# 変数に格納した値を出力
echo $name
# 変数に「bbb」に変更
name='bbb'
# 変数に格納した値を出力
echo $name
echo 'サブシェル終了'
) >> logfile4.log
# カレントディレクトリを出力
pwd >> logfile4.log
# 変数に格納した値を出力
echo $name >> logfile4.log
▼実行結果
「logfile4.log」の中身を確認
/work
aaa
サブシェル起動
/work
/work/tmp
aaa
bbb
サブシェル終了
/work
aaa
コメント