【Shell】コマンドをグループ化し、ログファイルに出力する

■コマンドのグループ化

複数のコマンドを実行し、まとめて一つのファイルに出力(リダイレクト)する場合、別々にコマンドを実行し、ファイルに出力する方法と、{ }を使用し、グルーピングしてコマンドを実行する方法がある。

▼実行するプログラムの概要

①日付をログファイルに出力する。
②「/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
タイトルとURLをコピーしました