haizhilingyu 的个人知识记录

Open Source, Open Mind,
Open Sight, Open Future!

shell脚本中的错误处理方式为脚本添加错误后的执行

shell脚本中的错误处理方式为脚本添加错误后的执行

事故原因

今天在执行同步脚本时发现scp发送文件完成后,竟然返回错误码导致脚本未执行完成,我打开obsidian后等很久都无法打开界面,查找原因后是obsidian会去加载node_modules文件夹,这可捅了马蜂窝了,CPU被大量占用,风扇直接呜呜的响。

做过前端开发的都知道node_modules文件夹存放了大量的前端依赖文件,动则几百兆的琐碎代码文件是真的恼火,我在Obsidian的设置中设置排除node_modules文件夹没用,所以直接在脚本中设置隐藏文件夹,将node_modules重命名为.node_modules

解决办法

之前因为是顺序执行报错不执行就可以了所以在脚本中添加set -e

现在多了重命名文件夹和恢复文件名的操作就必须设置错误处理命令,在执行错误后将文件夹名称恢复。设置trap命令后面跟执行错误处理方法,示例如下:

#!bin/bash
set -e
# shell script 中的 function
ErrorHandling () {
    if [ $? -ne 0 ]
    then 
        echo "执行失败"
    fi
}
# 报错后执行 ErrorHandling 错误处理方法
trap ErrorHandling EXIT
# 不存在 a.txt 文件
cp a.txt b.txt

obsidian同步和发布完整脚本

#!/bin/bash


echo "开始执行命令"
git add .
git status
#写个sleep 1s 是为了解决并发导致卡壳
sleep 1s
echo "####### 添加文件 #######"
time=$(date "+%Y-%m-%d %H:%M:%S")
git commit -m "$time"

echo "####### commit #######"

sleep 1s

echo "####### 开始拉取 #######"
git pull -r
echo "####### 拉取成功 #######"

echo "####### 开始推送 #######"
git push origin master
echo "####### 推送成功 #######"
# 设置错误中断执行
set -e
pub="publish"
# shell script 中的 function
ErrorHandling () {
    if [ $? -ne 0 ]
    then
        mv node_modules .node_modules
        mv scaffolds .scaffolds
        echo "執行失敗"
    fi
}

trap ErrorHandling EXIT

if [ $pub = $1 ]
then
    mv .node_modules node_modules
    mv .scaffolds scaffolds
    npm run clean
    npm run build

    scp -r public/* root@192.168.1.14:/usr/share/nginx/html
    npm run clean
    mv node_modules .node_modules
    mv scaffolds .scaffolds
fi


标题:shell脚本中的错误处理方式为脚本添加错误后的执行
作者:haizhilingyu
地址:https://xiweihai.site/articles/2024/05/12/1715501578236.html