#!/usr/bin/bash ############################################################################### # 变量 # ############################################################################### # 将终端的输出重置为默认设置,并且不会换行(用于重置终端的字体颜色、背景色和文本样式等设置) echo -e "\e[0m\c" # shellcheck disable=SC2016 # 脚本在执行过程中遇到任何非零返回码的命令时立即退出 set -e # 下载域 readonly DOWNLOAD_DOMAIN=https://gitea.whlug.cn/ # 下载保存路径 TMP_ROOT=/tmp/xunmi # 读取系统架构和内核信息 readonly UNAME_M="$(uname -m)" WorldType="新世界" # 加载系统信息 source /etc/os-release readonly Release=$(echo "${ID}") readonly ReleaseName=$(echo "${NAME}") # 获取项目路径 ItemDir=$1 ############################################################################### # 终端配色 # ############################################################################### # 颜色配置 readonly COLOUR_RESET='\e[0m' readonly aCOLOUR=( '\e[38;5;154m' # 0: 亮绿 '\e[1m' # 1: 白 '\e[90m' # 2: 灰 '\e[91m' # 3: 红 '\e[32m' # 4: 绿 '\e[33m' # 5: 黄 ) Show() { if (($1 == 0)); then echo -e "${aCOLOUR[2]}[$COLOUR_RESET${aCOLOUR[0]} 成功 $COLOUR_RESET${aCOLOUR[2]}]$COLOUR_RESET $2" elif (($1 == 1)); then echo -e "${aCOLOUR[2]}[$COLOUR_RESET${aCOLOUR[3]} 失败 $COLOUR_RESET${aCOLOUR[2]}]$COLOUR_RESET $2" exit 1 elif (($1 == 2)); then echo -e "${aCOLOUR[2]}[$COLOUR_RESET${aCOLOUR[4]} 信息 $COLOUR_RESET${aCOLOUR[2]}]$COLOUR_RESET $2" elif (($1 == 3)); then echo -e "${aCOLOUR[2]}[$COLOUR_RESET${aCOLOUR[5]} 通知 $COLOUR_RESET${aCOLOUR[2]}]$COLOUR_RESET $2" fi } # 灰色信息(处理一些无关紧要的信息, 调用后在没有清除颜色之前会一直使用灰色输出) GreyStart() { echo -e "${aCOLOUR[2]}\c" } # 清除颜色(一般和灰色信息连用) ColorReset() { echo -e "$COLOUR_RESET\c" } ############################################################################### # 函数/方法 # ############################################################################### # 检查文件是否存在 exist_file() { if [ -e "$1" ]; then return 0 else return 1 fi } # 识别架构 Check_Arch() { case $UNAME_M in *loongarch64*) TARGET_ARCH="loong64" ;; *) Show 1 "此模块仅支持 loong64 架构处理器暂不支持 $UNAME_M 架构" exit 1 ;; esac Show 2 "检测到 $TARGET_ARCH 架构" } # 检查发行版和世界信息 Check_Distribution() { sType=2 notice="" case $Release in *arch*) ;; *Loongnix*);; *openwrt*) Show 1 "暂不支持openwrt" exit 1 ;; *) sType=3 notice="我们尚未在此发行版上进行测试,默认使用新世界文件替换" ;; esac WorldNum=$(hexdump -s 48 -C /usr/bin/sh | head -n 1 | awk '{print $2}') if [[ ${WorldNum} == "03" ]]; then WorldType="旧世界" fi Show ${sType} "检测到 ${ReleaseName} 发行版系统, 根据内核版本推断属于 -> ${WorldType} <- 系统 " if [[ ${sType} == 1 ]]; then select yn in "Yes" "No"; do case $yn in [yY][eE][sS] | [yY]) Show 0 "检查已忽略" break ;; [nN][oO] | [nN]) Show 1 "已退出安装" exit 1 ;; esac done < /dev/tty # < /dev/tty 用于从终端读取输入信息 fi } # 下载替换依赖 DownloadAndInstall() { PACKAGES=( "${DOWNLOAD_DOMAIN}public/JetBrains_jna/releases/download/1.0/libjnidispatch_${WorldType}.so" "${DOWNLOAD_DOMAIN}public/JetBrains_pty4j/releases/download/1.0/libpty_${WorldType}.so" "${DOWNLOAD_DOMAIN}public/JetBrains_fsnotifier/releases/download/1.0/fsnotifier_${WorldType}" ) # 检测项目路径是否存在 exist_file $ItemDir/lib/jna/amd64 || Show 1 "未找到关键路径 '$ItemDir/lib/jna/amd64' 请使用最新版JetBrains" rm -rf ${TMP_ROOT} mkdir -p ${TMP_ROOT} || Show 1 "无法创建临时目录" TmpDir=$(mktemp -d -p ${TMP_ROOT} || Show 1 "无法创建临时目录") pushd "${TmpDir}" for PACKAGE in "${PACKAGES[@]}"; do Show 2 "下载 ${PACKAGE}..." GreyStart wget -t 3 -q --show-progress -c "${PACKAGE}" || Show 1 "无法下载程序包" ColorReset Show 0 "下载完成" done now=$(date +"%Y%m%d-%H%M%S") exist_file $ItemDir/lib/jna/amd64 || Show 1 "未找到指定路径 $ItemDir" Show 2 "开始文件替换" GreyStart mv -nv $ItemDir/lib/jna/amd64/libjnidispatch.so $ItemDir/lib/jna/amd64/libjnidispatch_x86_$now.so cp -v $TmpDir/libjnidispatch_${WorldType}.so $ItemDir/lib/jna/amd64/libjnidispatch.so mkdir -vp $ItemDir/lib/pty4j/linux/loongarch64 cp -v $TmpDir/libpty_${WorldType}.so $ItemDir/lib/pty4j/linux/loongarch64/libpty.so cp -v $TmpDir/fsnotifier_${WorldType} ~/.config/JetBrains/fsnotifier chmod -v 755 ~/.config/JetBrains/fsnotifier echo "idea.filewatcher.executable.path=$(readlink -f ~/.config/JetBrains/fsnotifier)" >> $ItemDir/bin/idea.properties ColorReset Show 0 "文件替换完成" } ############################################################################### # 入口(main) # ############################################################################### usage() { cat <<-EOF 使用方法: "$0 " PATH: JetBrains软件解压路径 EOF } if [ $# -eq 0 ]; then usage Show 1 "该脚本需要至少一个参数!" fi # 检查架构 Check_Arch # 检查发行版 Check_Distribution # 下载替换依赖 DownloadAndInstall