bash

外部テキストに複数記載したコマンドをシェルでまとめて実行する

テキストファイルにシェルやコマンドを記載してまとめて実行したい時以下のシェルスクリプトを使っています。こうする事でまとめてバックグランド実行できるので重宝します。そのため実行ログはファイルに残すようにしてあります。

仕様
シェルスクリプトファイル名:executer.sh
外部テキストファイル名:execmd.lst
実行例1:$ ./executer.sh execmd.lst
実行例2:$ ./executer.sh /home/sooni/execmd.lst
適当なフォルダでexecuter.shという名前で以下内容を保存します
#!/bin/bash
#
# 外部テキストファイルに記載したコマンドをevalを使って実行する
# 第一引数として実行コマンドを記載したファイル名を渡す
#
if [ $# != 1 ]; then echo "parameter error"; exit 1; fi

fl_path=$(cd $(dirname $1); pwd)/$(basename $1)
logfile=`dirname $fl_path`/`basename $fl_path .lst`.`date +%Y%m%d-%H%M%S`.log

echo "--- [ $fl_path ] ---" > $logfile
cat $fl_path >> $logfile
echo "--- [ $logfile ] ---" >> $logfile
while read line
do
  eval ${line} 2>&1 | tee -a $logfile
  #eval ${line} 2>&1 | tee >> $logfile
done < $fl_path
ls -ltr $fl_path $logfile
実行例
## 実行モードを変更
chmod 777 ./executer.sh

## 外部テキストファイル内容確認
##
$ cat execmd.lst
pwd
mkdir -p /tmp/work
cd /tmp/work
pwd
touch 02.txt
ls -lt /tmp/work
$

## 実行
$ ./executer.sh execmd.lst
/usr/oracle/test
/usr/oracle/test
合計 0
-rw-r--r--. 1 oracle oinstall  70 11月 13 01:45 /usr/oracle/test/execmd.lst
-rw-r--r--. 1 oracle oinstall 209 11月 13 01:49 /usr/oracle/test/execmd.20221113-014935.log

$
## ログファイル内容確認
$ cat /usr/oracle/test/execmd.20221113-014935.log
--- [ /usr/oracle/test/execmd.lst ] ---
pwd
mkdir -p /tmp/work
cd /tmp/work
pwd
touch 02.txt
ls -lt /tmp/work
--- [ /usr/oracle/test/execmd.20221113-014935.log ] ---
/usr/oracle/test
/usr/oracle/test
合計 0
$
以下解説
# 以下の部分で引数で受けたファイル名をフルパスで保持(フルパスで受けたらそのまま)
fl_path=$(cd $(dirname $1); pwd)/$(basename $1)

# basenameの第二引数に .lstと指定する事で識別子を除いています。
#(実際は末尾から除去しているだけのような動きに見えます)
basename $fl_path .lst

#引数で受け取ったファイルを一行づつ読みこんだものを変数に入れてevalで実行
# 2>&1 とする事で標準出力、標準エラー出力をまとめてteeとログファイルへ渡せています
#teeを使う時のポイントとして -a を使ってログファイルへ追記している事です。
#これを tee >> $logfile にしてしまうと、外部ファイルに記載したコマンドの実行結果およ
#エラーメッセージが標準出力されなくなります(ログファイルへは書き込まれます)
eval ${line} 2>&1 | tee -a $logfile

スポンサーリンク
コピペで使う