1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

シェル(Bash)のテストでシェル内のコマンドの戻り値をエラーにする方法

Posted at

シェル(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. テスト対象シェル

テスト対象のシェルは以下の通り。
(わかりやすくするために簡単なシェルにしています。)

sample.sh
#!/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)を用意します。

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]#

rmdeclareコマンドで参照してみます。
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関数が削除され、元の状態に戻りました。


以上

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?