シェル(Bash)のテストでエラー分岐の処理を確認するために、シェル内のコマンドの戻りをエラーとさせた時の方法を残しておきます。
1. 環境
- OS : CentOS Linux release 8.5.2111
- bash : GNU bash, バージョン 4.4.20(1)-release (x86_64-redhat-linux-gnu)
[root@centos85 ~]# cat /etc/redhat-release
CentOS Linux release 8.5.2111
[root@centos85 ~]# bash --version
GNU bash, バージョン 4.4.20(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2016 Free Software Foundation, Inc.
ライセンス GPLv3+: GNU GPL バージョン 3 またはそれ以降 <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
[root@centos85 ~]#
2. テスト対象シェル
テスト対象のシェルは以下の通り。
(わかりやすくするために簡単なシェルにしています。)
#!/bin/bash
FILE_PATH=/tmp/sample.txt
echo "処理開始"
touch FILE_PATH
rm -f FILE_PATH
RET=$?
if [ $RET == 0 ]; then
echo "ファイルの削除に成功しました。"
else
echo "ファイルの削除に失敗しました。"
fi
echo "正常終了"
exit 0
このシェル(sample.sh
)を実行すると以下の通り正常終了します。
[root@centos85 test]# ./sample.sh
処理開始
ファイルの削除に成功しました。
正常終了
[root@centos85 test]#
rm -f
コマンドをエラーとして、上記のシェルのif
文のelse
を実行させたいと思います。
2. ダミーシェルの登録
以下のダミーシェル(dummy_rm.sh
)を用意します。
#!/bin/bash
function rm(){
echo "ファイル削除コマンドエラー"
return 1
}
以下のコマンドでダミーシェルを読み込みます。
. ./dummy_rm.sh
[root@centos85 test]# . ./dummy_rm.sh
[root@centos85 test]#
読み込んだ関数rm
関数をdeclare
コマンドで参照してみます。
declare -fp rm
[root@centos85 test]# declare -fp rm
rm ()
{
echo "ファイル削除コマンドエラー";
return 1
}
[root@centos85 test]#
さらに、export
コマンドで、rm
関数を環境変数として設定します。
export -f rm
[root@centos85 test]# export -f rm
[root@centos85 test]#
rm
をdeclare
コマンドで参照してみます。
declare -fp rm
[root@centos85 test]# declare -fp rm
rm ()
{
echo "ファイル削除コマンドエラー";
return 1
}
declare -fx rm
[root@centos85 test]#
これで、sample.sh
を実行した際に、シェルの中でrm
コマンドを実行すると、ダミーシェルのrm
関数が呼ばれるようになります。
3. テスト対象シェルを実行
テスト対象シェル(sample.sh
)を実行すると、rm
の実行でダミーとして登録したrm
関数が呼ばれ、今度は以下の通りエラーとなります。
[root@centos85 test]# ./sample.sh
処理開始
ファイル削除コマンドエラー
ファイルの削除に失敗しました。
正常終了
[root@centos85 test]#
4. 環境変数等の戻し
以下のコマンドで環境変数からrm
を削除します。
export -fn rm
[root@centos85 test]# export -fn rm
[root@centos85 test]#
declare
で確認してみます。
declare -fp rm
[root@centos85 test]# declare -fp rm
rm ()
{
echo "ファイル削除コマンドエラー";
return 1
}
[root@centos85 test]#
declare -fx rm
の部分が削除されています。
最後にunset
コマンドでrm
関数を削除します。
unset -f rm
[root@centos85 test]# unset -f rm
[root@centos85 test]#
declare
で確認してみます。
declare -fp rm
[root@centos85 test]# declare -fp rm
-bash: declare: rm: 見つかりません
[root@centos85 test]#
これでダミーのrm
関数が削除され、元の状態に戻りました。
以上