初步测试,都 OK。
最终修正版 Shell 脚本冲突检测工具 v5.8(双冲突检测修复版)
check_conflicts_v5.8.sh :96 行Shell 脚本冲突检测工具 v5.8 使用说明书
check_conflicts_v5.8.sh :87 行说明:AI 生成,人工检测。初步测试 OK。
- 别名的意义:制作命令行快捷键。
检测能力说明
三级冲突检测:
文件内冲突:同一文件中重复定义的别名
跨文件冲突:不同脚本文件中定义的相同别名
系统级冲突:
与
~/.bashrc
中定义的别名冲突与系统命令冲突
source ~/.bashrc
在文件的尾部,需要添加:
## ~/.bashrc
## 加载目录下所有别名文件
for file in ~/my_aliases/*; do
if [ -f "$file" ]; then
. "$file"
fi
done
-------------------------------------------------------------
关联参考:
{AAA} doing .bashrc 工作别名 alias (*****) https://blog.csdn.net/ken2232/article/details/147759501?spm=1011.2415.3001.5331
{AAA} bash Shell 脚本检查别名冲突检测工具 (*****) 测试 OK {AAA} bash Shell 脚本检查别名冲突检测工具 (*****) 测试 OK-CSDN博客
ubuntu,加载多个别名文件。怎样检测自定义的别名,与操作系统的命令,是否发生冲突?https://blog.csdn.net/ken2232/article/details/147744043?spm=1011.2415.3001.5331
如何安全地添加自定义别名?删除、修改、检查现有别名? https://blog.csdn.net/ken2232/article/details/147743749?spm=1011.2415.3001.5331
Ubuntu Bash 2次运行 source ~/.bashrc,shell 脚本中有同一个别名abcc,别名的覆盖问题与处理方法 https://blog.csdn.net/ken2232/article/details/147758727?spm=1011.2415.3001.5331
alias 是简单的字符串替换,不会主动解析位置参数。alias 中的 $@ 不会按预期工作。别名需通过 ! 或 “$@“ 间接支持参数 https://blog.csdn.net/ken2232/article/details/147757057?spm=1011.2415.3001.5331
采用别名 abc_alias 来调用foo()函数,同时传入参数 String 和 Number?别名冲突检测 (***) https://blog.csdn.net/ken2232/article/details/147753241?spm=1011.2415.3001.5331
===================================
{AAA} 别名 三级冲突检测:文件内冲突,跨文件冲突,系统级冲突(与~/.bashrc,
与系统命令)(***) 测试 OK << 推荐
- 本文没有具体的使用方法,需要参考下面的其他文章。
- 初步测试:解决了函数名的冲突问题。
DeepSeek-R1满血版 回答完成
深度思考完成 用时165秒
以下是完整的解决方案,用于检测Shell脚本中的别名和函数冲突,包括别名与别名、函数与函数、别名与函数、以及它们与系统命令和.bashrc定义的冲突:
bashCopy Code
#!/bin/bash
# 终极Shell冲突检测工具 v7.0
# 检测范围:脚本目录、~/.bashrc、系统命令
# 新增功能:支持函数与别名、函数与函数、函数与系统命令的冲突检测
RED='\033[31m' # 错误
GREEN='\033[32m' # 成功
YELLOW='\033[33m' # 警告
BLUE='\033[34m' # 文件信息
CYAN='\033[36m' # 提示
NC='\033[0m'
target_dir="$1"
conflict_log="conflicts_$(date +%Y%m%d_%H%M%S).log"
# 参数校验
if [[ $# -ne 1 ]] || [[ ! -d "$target_dir" ]]; then
echo -e "${RED}参数错误:必须指定有效目录\n${CYAN}用法:$0 /path/to/scripts${NC}"
exit 1
fi
: > "$conflict_log"
declare -A global_aliases # 全局别名存储[别名]=文件1:行号 文件2:行号...
declare -A global_functions # 全局函数存储[函数名]=文件1:行号 文件2:行号...
declare -A bashrc_aliases # 存储.bashrc中的别名
declare -A bashrc_functions # 存储.bashrc中的函数
#------------------------------
# 记录.bashrc中的别名和函数
scan_bashrc_definitions() {
echo -e "${BLUE}扫描 ~/.bashrc 中的定义...${NC}"
local line_num=0
while IFS= read -r line; do
((line_num++))
# 处理别名
if [[ "$line" =~ ^[[:space:]]*alias[[:space:]]+ ]]; then
alias_name=$(sed -E 's/^[[:space:]]*alias[[:space:]]+//; s/=["'\''].*//' <<< "$line")
bashrc_aliases["$alias_name"]="$line_num"
# 处理函数
elif [[ "$line" =~ ^[[:space:]]*(function[[:space:]]+)?[a-zA-Z_][a-zA-Z0-9_]*[[:space:]]*$ ]]; then
func_name=$(sed -E 's/^[[:space:]]*(function[[:space:]]+)?//; s/[[:space:]]*\(.*//' <<< "$line")
func_name=$(awk '{gsub(/^[ \t]+|[ \t]+$/, ""); print}' <<< "$func_name")
bashrc_functions["$func_name"]="$line_num"
fi
done < ~/.bashrc
}
#------------------------------
# 检测系统命令冲突
check_system_command() {
local name="$1" file="$2" line_num="$3" type="$4"
if type -P "$name" &>/dev/null; then
echo -e "${YELLOW}警告:${file}:${line_num} ${type} [$name] 覆盖系统命令 -> $(type -P "$name")${NC}"
echo "[系统冲突] $file:$line_num $type '$name' conflicts with: $(type -P "$name")" >> "$conflict_log"
return 1
fi
return 0
}
#------------------------------
# 检测.bashrc冲突
check_bashrc_conflict() {
local name="$1" file="$2" line_num="$3" type="$4"
local conflict_type="" line_ref=""
if [[ -n "${bashrc_aliases[$name]}" ]]; then
conflict_type="别名"
line_ref="${bashrc_aliases[$name]}"
elif [[ -n "${bashrc_functions[$name]}" ]]; then
conflict_type="函数"
line_ref="${bashrc_functions[$name]}"
fi
if [[ -n "$conflict_type" ]]; then
echo -e "${RED}严重:${file}:${line_num} ${type} [$name] 与 ~/.bashrc:${line_ref} 的${conflict_type}冲突${NC}"
echo "[bashrc冲突] $file:$line_num $type '$name' conflicts with ~/.bashrc:$conflict_type at line $line_ref" >> "$conflict_log"
return 1
fi
return 0
}
#------------------------------
# 处理文件核心逻辑
process_file() {
local file="$1"
echo -e "\n${BLUE}检测文件:$file${NC}"
declare -A local_defs # 记录文件内所有定义[名称]="类型:行号"
local line_num=0
while IFS= read -r line; do
((line_num++))
line_clean=$(sed -E 's/#.*//' <<< "$line") # 忽略注释
# 跳过空行
[[ "$line_clean" =~ ^[[:space:]]*$ ]] && continue
# 处理别名
if [[ "$line_clean" =~ ^[[:space:]]*alias[[:space:]]+ ]]; then
alias_name=$(sed -E '
s/^[[:space:]]*alias[[:space:]]+//
s/=["'\''].*//
s/^["'\'']//; s/["'\'']$//
' <<< "$line_clean")
if [[ -n "$alias_name" ]]; then
# 文件内冲突检测
if [[ -n "${local_defs[$alias_name]}" ]]; then
IFS=':' read -r prev_type prev_line <<< "${local_defs[$alias_name]}"
echo -e "${RED}错误:${file}:${line_num} 别名 [$alias_name] 与 $prev_type 在行 ${prev_line} 冲突${NC}"
echo "[文件冲突] $file:$line_num alias '$alias_name' conflicts with $prev_type at line $prev_line" >> "$conflict_log"
else
local_defs["$alias_name"]="别名:${line_num}"
fi
# 系统命令检测
check_system_command "$alias_name" "$file" "$line_num" "别名"
# .bashrc冲突检测
check_bashrc_conflict "$alias_name" "$file" "$line_num" "别名"
# 全局记录
global_aliases["$alias_name"]+="$file:$line_num "
fi
# 处理函数
elif [[ "$line_clean" =~ ^[[:space:]]*(function[[:space:]]+)?[a-zA-Z_][a-zA-Z0-9_]*[[:space:]]*\( ]]; then
func_name=$(sed -E '
s/^[[:space:]]*(function[[:space:]]+)?//
s/[[:space:]]*\([[:space:]]*$.*//
s/[[:space:]]+$//
' <<< "$line_clean")
if [[ -n "$func_name" ]]; then
# 文件内冲突检测
if [[ -n "${local_defs[$func_name]}" ]]; then
IFS=':' read -r prev_type prev_line <<< "${local_defs[$func_name]}"
echo -e "${RED}错误:${file}:${line_num} 函数 [$func_name] 与 $prev_type 在行 ${prev_line} 冲突${NC}"
echo "[文件冲突] $file:$line_num function '$func_name' conflicts with $prev_type at line $prev_line" >> "$conflict_log"
else
local_defs["$func_name"]="函数:${line_num}"
fi
# 系统命令检测
check_system_command "$func_name" "$file" "$line_num" "函数"
# .bashrc冲突检测
check_bashrc_conflict "$func_name" "$file" "$line_num" "函数"
# 全局记录
global_functions["$func_name"]+="$file:$line_num "
fi
fi
done < "$file"
}
#------------------------------
# 全局冲突检测
check_global_conflicts() {
echo -e "\n${CYAN}=== 跨文件冲突扫描 ===${NC}"
# 别名冲突检测
for name in "${!global_aliases[@]}"; do
IFS=' ' read -ra locations <<< "${global_aliases[$name]}"
if ((${#locations[@]} > 1)); then
echo -e "${YELLOW}警告:别名 [$name] 在多个位置定义:${NC}"
printf " ▷ %s\n" "${locations[@]}"
echo "[跨文件别名冲突] alias '$name' defined at: ${locations[*]}" >> "$conflict_log"
fi
done
# 函数冲突检测
for name in "${!global_functions[@]}"; do
IFS=' ' read -ra locations <<< "${global_functions[$name]}"
if ((${#locations[@]} > 1)); then
echo -e "${YELLOW}警告:函数 [$name] 在多个位置定义:${NC}"
printf " ▷ %s\n" "${locations[@]}"
echo "[跨文件函数冲突] function '$name' defined at: ${locations[*]}" >> "$conflict_log"
fi
done
# 别名与函数交叉冲突检测
for name in "${!global_aliases[@]}"; do
if [[ -n "${global_functions[$name]}" ]]; then
echo -e "${RED}严重:名称 [$name] 同时存在别名和函数定义:${NC}"
echo " ▷ 别名位置:${global_aliases[$name]}"
echo " ▷ 函数位置:${global_functions[$name]}"
echo "[类型冲突] name '$name' has both alias and function definitions" >> "$conflict_log"
fi
done
}
#------------------------------
# 主流程
main() {
scan_bashrc_definitions
# 处理目标目录下的所有.sh文件
while IFS= read -r -d '' file; do
process_file "$file"
done < <(find "$target_dir" -type f -name "*.sh" -print0)
check_global_conflicts
# 最终统计
conflict_count=$(grep -c "^\[" "$conflict_log" 2>/dev/null)
if ((conflict_count > 0)); then
echo -e "\n${RED}发现 $conflict_count 处冲突!详细日志:${conflict_log}${NC}"
exit 1
else
echo -e "\n${GREEN}✓ 未检测到任何冲突${NC}"
rm -f "$conflict_log"
exit 0
fi
}
main
使用说明:
- 将脚本保存为
check-conflicts.sh
- 赋予执行权限:
chmod +x check-conflicts.sh
- 运行脚本并指定要检测的目录:
./check-conflicts.sh /path/to/scripts
功能特性:
- 检测范围包括:
- 指定目录下的所有.sh文件
- 用户家目录的.bashrc文件
- 系统PATH中的可执行命令
- 检测类型包括:
- 别名与别名的冲突(同文件/跨文件)
- 函数与函数的冲突(同文件/跨文件)
- 别名与函数的冲突(同文件/跨文件)
- 自定义定义与系统命令的冲突
- 自定义定义与.bashrc定义的冲突
- 输出信息包含:
- 冲突类型(错误/警告/严重)
- 冲突发生的具体文件路径和行号
- 冲突双方的具体位置信息
- 自动生成的详细日志文件
输出示例:
textCopy Code
检测文件:/path/to/scripts/test.sh
错误:/path/to/scripts/test.sh:25 函数 [foo] 与 别名 在行 12 冲突
警告:/path/to/scripts/test.sh:30 函数 [ls] 覆盖系统命令 -> /bin/ls
严重:/path/to/scripts/test.sh:15 别名 [grep] 与 ~/.bashrc:89 的别名冲突
=== 跨文件冲突扫描 ===
警告:函数 [logger] 在多个位置定义:
▷ /path/to/scripts/utils.sh:45
▷ /path/to/scripts/network.sh:12
严重:名称 [backup] 同时存在别名和函数定义:
▷ 别名位置:/path/to/scripts/tool.sh:33
▷ 函数位置:/path/to/scripts/backup.sh:5
注意事项:
- 需要bash 4.0+版本支持关联数组
- 建议在检测前备份.bashrc文件
- 检测结果中的系统命令冲突可能包含误报(取决于PATH环境变量)
- 日志文件会自动生成在运行目录下,格式为conflicts_YYYYMMDD_HHMMSS.log
{AA} 别名 三级冲突检测:文件内冲突,跨文件冲突,系统级冲突(与~/.bashrc,
与系统命令)(**)
不能测试到函数名冲突********
要求:对用户目录下在脚本文件中的别名,~/.bashrc文件中的别名,操作系统中的命令进行检查,给出同名冲突的详细信息。下面这个脚本,无法检查在 ~/.bashrc 中的别名,与在用户脚本中的别名的同名冲突问题,请修正。当发生冲突是,需要给出错误发生时,具体的文件名,别名,以及行号。请提供完整的解决方案,以及使用说明。
#!/bin/bash
# 终极Shell冲突检测工具 v6.0
# 检测范围:脚本目录、~/.bashrc、系统命令
RED='\033[31m' # 错误
GREEN='\033[32m' # 成功
YELLOW='\033[33m' # 警告
BLUE='\033[34m' # 文件信息
CYAN='\033[36m' # 提示
NC='\033[0m'
## 修改 2 处,将产生的 log 放在一个文件夹里
mkdir -p alias_conflicts_log ####### 1. 增加
target_dir="$1"
conflict_log=alias_conflicts_log\/"conflicts_$(date +%Y%m%d_%H%M%S).log" ###### 2. 修改
以下是 终极完整版Shell冲突检测脚本,完整解决所有检测需求(包括~/.bashrc冲突检测):
bash
#!/bin/bash
# 终极Shell冲突检测工具 v6.0
# 检测范围:脚本目录、~/.bashrc、系统命令
RED='\033[31m' # 错误
GREEN='\033[32m' # 成功
YELLOW='\033[33m' # 警告
BLUE='\033[34m' # 文件信息
CYAN='\033[36m' # 提示
NC='\033[0m'
target_dir="$1"
conflict_log="conflicts_$(date +%Y%m%d_%H%M%S).log"
# 参数校验
if [[ $# -ne 1 ]] || [[ ! -d "$target_dir" ]]; then
echo -e "${RED}参数错误:必须指定有效目录\n${CYAN}用法:$0 /path/to/scripts${NC}"
exit 1
fi
: > "$conflict_log"
declare -A global_aliases # 全局别名存储[别名]=文件1:行号 文件2:行号...
declare -A bashrc_aliases # 存储.bashrc中的别名
#------------------------------
# 记录.bashrc中的别名
scan_bashrc_aliases() {
echo -e "${BLUE}扫描 ~/.bashrc 中的别名...${NC}"
local line_num=0
while IFS= read -r line; do
((line_num++))
if [[ "$line" =~ ^[[:space:]]*alias[[:space:]]+ ]]; then
alias_name=$(sed -E 's/^[[:space:]]*alias[[:space:]]+//; s/=["'\''].*//' <<< "$line")
bashrc_aliases["$alias_name"]="$line_num"
fi
done < ~/.bashrc
}
#------------------------------
# 检测系统命令冲突
check_system_command() {
local name="$1" file="$2" line_num="$3"
if type -P "$name" &>/dev/null; then
echo -e "${YELLOW}警告:${file}:${line_num} 别名 [$name] 覆盖系统命令 -> $(type -P "$name")${NC}"
echo "[系统冲突] $file:$line_num alias '$name' conflicts with: $(type -P "$name")" >> "$conflict_log"
return 1
fi
return 0
}
#------------------------------
# 检测.bashrc冲突
check_bashrc_conflict() {
local name="$1" file="$2" line_num="$3"
if [[ -n "${bashrc_aliases[$name]}" ]]; then
echo -e "${RED}严重:${file}:${line_num} 别名 [$name] 与 ~/.bashrc:${bashrc_aliases[$name]} 冲突${NC}"
echo "[bashrc冲突] $file:$line_num alias '$name' conflicts with ~/.bashrc:${bashrc_aliases[$name]}" >> "$conflict_log"
return 1
fi
return 0
}
#------------------------------
# 别名处理核心逻辑
process_file() {
local file="$1"
echo -e "\n${BLUE}检测文件:$file${NC}"
declare -A local_aliases # 文件内别名去重
local line_num=0 alias_name
while IFS= read -r line; do
((line_num++))
if [[ "$line" =~ ^[[:space:]]*alias[[:space:]]+ ]]; then
# 精准提取别名名
alias_name=$(sed -E '
s/^[[:space:]]*alias[[:space:]]+//
s/=["'\''].*//
s/^["'\'']//; s/["'\'']$//
' <<< "$line")
if [[ -n "$alias_name" ]]; then
# 系统命令冲突检测
check_system_command "$alias_name" "$file" "$line_num"
# .bashrc冲突检测
check_bashrc_conflict "$alias_name" "$file" "$line_num"
# 文件内冲突检测
if [[ -n "${local_aliases[$alias_name]}" ]]; then
echo -e "${RED}错误:${file}:${line_num} 别名 [$alias_name] 与行 ${local_aliases[$alias_name]} 重复${NC}"
echo "[文件冲突] $file:$line_num duplicate alias '$name' with line ${local_aliases[$alias_name]}" >> "$conflict_log"
else
local_aliases["$alias_name"]=$line_num
global_aliases["$alias_name"]+="$file:$line_num " # 全局存储
fi
fi
fi
done < "$file"
}
#------------------------------
# 跨文件冲突检测
check_global_conflicts() {
echo -e "\n${CYAN}=== 跨文件冲突扫描 ===${NC}"
for name in "${!global_aliases[@]}"; do
IFS=' ' read -ra locations <<< "${global_aliases[$name]}"
if (( ${#locations[@]} > 1 )); then
echo -e "${YELLOW}警告:别名 [$name] 在多个位置定义:${NC}"
printf " ▷ %s\n" "${locations[@]}"
echo "[跨文件冲突] alias '$name' defined at: ${locations[*]}" >> "$conflict_log"
fi
done
}
#------------------------------
# 主流程
main() {
scan_bashrc_aliases
# 处理目标目录下的所有.sh文件
while IFS= read -r -d '' file; do
process_file "$file"
done < <(find "$target_dir" -type f -name "*.sh" -print0)
check_global_conflicts
# 最终统计
conflict_count=$(grep -c "^\[" "$conflict_log")
if (( conflict_count > 0 )); then
echo -e "\n${RED}发现 $conflict_count 处冲突!详细日志:${conflict_log}${NC}"
exit 1
else
echo -e "\n${GREEN}✓ 未检测到任何冲突${NC}"
rm -f "$conflict_log"
exit 0
fi
}
main
📌 使用说明
-
基本用法:
bash
chmod +x shell_conflict_detector.sh ./shell_conflict_detector.sh /path/to/your/scripts
-
检测范围:
-
指定目录下的所有
.sh
文件 -
当前用户的
~/.bashrc
文件 -
系统PATH中的所有命令
-
-
输出示例:
扫描 ~/.bashrc 中的别名... 检测文件:/path/to/scripts/test.sh 警告:/path/to/scripts/test.sh:5 别名 [ll] 覆盖系统命令 -> /usr/bin/ls 严重:/path/to/scripts/test.sh:8 别名 [grep] 与 ~/.bashrc:23 冲突 === 跨文件冲突扫描 === 警告:别名 [clean] 在多个位置定义: ▷ /path/to/scripts/utils.sh:15 ▷ /path/to/scripts/clean.sh:3 发现 3 处冲突!详细日志:conflicts_20230815_142356.log
-
日志文件内容:
[系统冲突] /path/to/scripts/test.sh:5 alias 'll' conflicts with: /usr/bin/ls [bashrc冲突] /path/to/scripts/test.sh:8 alias 'grep' conflicts with ~/.bashrc:23 [跨文件冲突] alias 'clean' defined at: /path/to/scripts/utils.sh:15 /path/to/scripts/clean.sh:3
🔍 检测能力说明
-
三级冲突检测:
-
文件内冲突:同一文件中重复定义的别名
-
跨文件冲突:不同脚本文件中定义的相同别名
-
系统级冲突:
-
与
~/.bashrc
中定义的别名冲突 -
与系统命令冲突
-
-
-
精准定位:
-
显示冲突的具体文件名和行号
-
对于.bashrc冲突显示.bashrc中的定义行号
-
对于系统命令冲突显示命令完整路径
-
-
日志记录:
-
自动生成带时间戳的日志文件
-
分类记录不同冲突类型
-
🛠 高级用法
-
仅检查.bashrc冲突:
bash
./shell_conflict_detector.sh /path | grep -A 3 "~/.bashrc"
-
集成到CI/CD:
bash
if ! ./shell_conflict_detector.sh src/scripts; then echo "::error::发现Shell定义冲突!" exit 1 fi
-
忽略特定冲突:
bash
./shell_conflict_detector.sh /path | grep -v -E "ll|grep" # 忽略ll和grep的冲突
💡 最佳实践建议
-
冲突解决优先级:
text
-
1. 修复与.bashrc的冲突(最高优先级) 2. 修复与系统命令的冲突 3. 解决跨文件重复定义 4. 解决文件内重复定义
-
命名规范建议:
bash
# 添加项目前缀避免冲突 alias myproj_ll='ls -la' function myproj_clean() { ... }
-
定期检查:
bash
# 添加到crontab每月检查 0 0 1 * * /path/to/shell_conflict_detector.sh /project/scripts
这个脚本提供了企业级的冲突检测能力,特别适合团队协作环境下的Shell脚本开发维护。
{A} bash Shell 脚本检查别名冲突检测工具 (**)
1. 完整修复版 Shell 脚本冲突检测工具 v5.6(跨文件别名冲突修复版),已经解决了在跨文件时,别名相同的冲突错误。但是,又产生的新的错误,无法检测到别名与操作系统的命令,发生同名的冲突错误。2. 完整修正版 Shell 脚本冲突检测工具 v5.7(系统命令冲突修复版),解决了无法检测到别名与操作系统的命令,发生同名的冲突错误;但又产生了新的错误,无法检查跨文件的别名冲突错误。 需要提供:给出完整的脚本,以及具体的使用方法
DeepSeek-R1满血版 回答完成
深度思考完成 用时18秒,搜索全网19篇资料
最终修正版 Shell 脚本冲突检测工具 v5.8(双冲突检测修复版)
??好像不能检查与 ~/.bashrc
中的别名的冲突?解决:直接摘取
~/.bashrc
中的别名放到用户自定义的别名下即可(直接使用整个
.bashrc
文件,会导致终端崩溃)。
bashCopy Code :( 初步检测 OK )
#!/bin/bash
# Shell 脚本冲突检测工具 v5.8
# 同步修复跨文件冲突和系统命令冲突
RED='\033[31m' # 错误
YELLOW='\033[33m' # 警告
BLUE='\033[34m' # 文件信息
CYAN='\033[36m' # 提示
NC='\033[0m'
target_dir="$1"
conflict_log="conflicts_$(date +%Y%m%d).log"
# 参数校验:ml-citation{ref="1,7" data="citationList"}
if [[ $# -ne 1 ]] || [[ ! -d "$target_dir" ]]; then
echo -e "${RED}参数错误:必须指定有效目录\n${CYAN}用法:$0 /path/to/scripts${NC}"
exit 1
fi
: > "$conflict_log"
declare -A global_aliases # 全局别名存储:ml-citation{ref="4" data="citationList"}
#------------------------------
# 检测系统命令冲突:ml-citation{ref="4,7" data="citationList"}
check_system_command() {
local name="$1"
if type -P "$name" &>/dev/null; then
echo -e "${YELLOW}警告:别名 [$name] 覆盖系统命令${NC}"
echo "[系统命令] alias_conflict:$name" >> "$conflict_log"
fi
}
#------------------------------
# 别名处理核心逻辑:ml-citation{ref="4,8" data="citationList"}
process_file() {
local file="$1"
echo -e "\n${BLUE}检测文件:$file${NC}"
declare -A local_aliases
local line_num=0 alias_name
while IFS= read -r line; do
((line_num++))
if [[ "$line" =~ ^[[:space:]]*alias[[:space:]]+ ]]; then
# 精准提取别名名:ml-citation{ref="7" data="citationList"}
alias_name=$(sed -E '
s/^[[:space:]]*alias[[:space:]]+//
s/^["'\'']?([^"'\''=]+)["'\'']?=.*/\1/
' <<< "$line")
if [[ -n "$alias_name" ]]; then
# 系统命令冲突检测:ml-citation{ref="4" data="citationList"}
check_system_command "$alias_name"
# 文件内冲突检测:ml-citation{ref="5" data="citationList"}
if [[ -n "${local_aliases[$alias_name]}" ]]; then
echo -e "${RED}冲突:别名 [$alias_name] 在行 ${local_aliases[$alias_name]} 和 $line_num 重复定义${NC}"
echo "[$file] alias_conflict:$alias_name lines:${local_aliases[$alias_name]},$line_num" >> "$conflict_log"
else
local_aliases["$alias_name"]=$line_num
global_aliases["$alias_name"]+="$file:$line_num " # 全局存储:ml-citation{ref="4" data="citationList"}
fi
fi
fi
done < "$file"
}
#------------------------------
# 跨文件冲突检测:ml-citation{ref="4,8" data="citationList"}
check_global_conflicts() {
echo -e "\n${CYAN}=== 跨文件冲突扫描 ===${NC}"
for name in "${!global_aliases[@]}"; do
IFS=' ' read -ra locations <<< "${global_aliases[$name]}"
if (( ${#locations[@]} > 1 )); then
echo -e "${YELLOW}⚠ 跨文件别名冲突:[$name] 在以下位置定义:"
printf " ▷ %s\n" "${locations[@]}"
echo -e "${NC}"
echo "[跨文件] alias_conflict:$name locations:${locations[*]}" >> "$conflict_log"
fi
done
}
#------------------------------
# 主流程(修复子shell变量丢失问题):ml-citation{ref="8" data="citationList"}
main() {
# 关键修复:避免管道导致子shell变量丢失:ml-citation{ref="8" data="citationList"}
while IFS= read -r -d '' file; do
process_file "$file"
done < <(find "$target_dir" -type f -name "*.sh" -print0)
check_global_conflicts
echo -e "\n${CYAN}检测完成!详细日志:${conflict_log}${NC}"
}
main
核心修正点
1. 跨文件冲突检测失效修复
- 问题原因:
find | while
管道导致global_aliases
数组在子shell中运行,父进程无法获取数据8 - 解决方案:改用进程替换
< <(find ...)
保持主进程上下文8
2. 双冲突检测逻辑
冲突类型 | 检测逻辑 | 日志标记 |
---|---|---|
系统命令冲突 | 通过 type -P 验证别名是否与系统命令同名47 | [系统命令] |
文件内重复定义 | 使用 local_aliases 数组跟踪当前文件别名定义行号4 | [文件名] |
跨文件别名冲突 | 通过 global_aliases 数组聚合所有文件别名定义位置4 | [跨文件] |
3. 路径处理增强
- 使用
find -print0
和read -d ''
处理含空格的特殊路径2
使用方法
1. 部署脚本
bashCopy Code
# 创建脚本文件
nano check_conflicts_v5.8.sh
# 粘贴上述代码后保存
# 设置执行权限
chmod +x check_conflicts_v5.8.sh
2. 测试用例
bashCopy Code
mkdir -p ~/test_scripts
cat << EOF > ~/test_scripts/utils.sh
alias ls='custom_ls --color=auto' # 覆盖系统命令
alias docker_ps='docker ps' # 跨文件冲突定义
EOF
cat << EOF > ~/test_scripts/main.sh
alias grep='ggrep -P' # 覆盖系统命令
alias docker_ps='docker ps -a' # 跨文件冲突定义
EOF
3. 执行检测
bashCopy Code
./check_conflicts_v5.8.sh ~/test_scripts
4. 预期输出
textCopy Code
检测文件:/home/user/test_scripts/utils.sh
警告:别名 [ls] 覆盖系统命令
检测文件:/home/user/test_scripts/main.sh
警告:别名 [grep] 覆盖系统命令
=== 跨文件冲突扫描 ===
⚠ 跨文件别名冲突:[docker_ps] 在以下位置定义:
▷ /home/user/test_scripts/utils.sh:3
▷ /home/user/test_scripts/main.sh:4
检测完成!详细日志:conflicts_20250507.log
日志文件示例
logCopy Code
[系统命令] alias_conflict:ls
[系统命令] alias_conflict:grep
[utils.sh] alias_conflict:docker_ps lines:3
[main.sh] alias_conflict:docker_ps lines:4
[跨文件] alias_conflict:docker_ps locations:/test_scripts/utils.sh:3 /test_scripts/main.sh:4
故障排查
-
未检测到跨文件冲突
- 检查测试文件是否使用
.sh
扩展名6 - 确保全局数组
global_aliases
使用+=
运算符追加数据4
- 检查测试文件是否使用
-
系统命令误报
- 使用
type -P
验证命令是否真实存在7 - 示例:
type -P ls
应返回/bin/ls
7
- 使用
最佳实践
-
命名规范
bashCopy Code
# 推荐:添加项目前缀 alias myapp_ls='ls -l' # 避免与系统命令冲突
-
冲突解决建议
- 集中管理公共别名到
~/.bash_aliases
文件2 - 使用
unalias
命令移除冲突别名5
- 集中管理公共别名到
提供最新答案最终修正版 Shell 脚本冲突检测工具 v5.8(双冲突检测修复版)的详细使用说明书
DeepSeek-R1满血版 回答完成
深度思考完成 用时18秒,搜索全网22篇资料
Shell 脚本冲突检测工具 v5.8 使用说明书
一、工具概述
本工具用于检测 Shell 脚本中别名定义冲突,包含以下两种冲突类型:
- 跨文件别名冲突:同一别名在多个脚本文件中重复定义38
- 系统命令覆盖冲突:别名与操作系统内置命令同名7
二、部署步骤
-
创建脚本文件
bashCopy Code
nano check_conflicts_v5.8.sh
粘贴以下内容并保存:
bashCopy Code ( 初步检测 OK )
#!/bin/bash # Shell 脚本冲突检测工具 v5.8(双冲突检测修复版) RED='\033[31m' # 错误 YELLOW='\033[33m' # 警告 BLUE='\033[34m' # 文件信息 CYAN='\033[36m' # 提示 NC='\033[0m' target_dir="$1" conflict_log="conflicts_$(date +%Y%m%d).log" # 参数校验 if [[ $# -ne 1 ]] || [[ ! -d "$target_dir" ]]; then echo -e "${RED}参数错误:必须指定有效目录\n${CYAN}用法:$0 /path/to/scripts${NC}" exit 1 fi : > "$conflict_log" declare -A global_aliases # 全局别名存储 #------------------------------ # 检测系统命令冲突 check_system_command() { local name="$1" if type -P "$name" &>/dev/null; then echo -e "${YELLOW}警告:别名 [$name] 覆盖系统命令${NC}" echo "[系统命令] alias_conflict:$name" >> "$conflict_log" fi } #------------------------------ # 别名处理核心逻辑 process_file() { local file="$1" echo -e "\n${BLUE}检测文件:$file${NC}" declare -A local_aliases local line_num=0 alias_name while IFS= read -r line; do ((line_num++)) if [[ "$line" =~ ^[[:space:]]*alias[[:space:]]+ ]]; then alias_name=$(sed -E ' s/^[[:space:]]*alias[[:space:]]+// s/^["'\'']?([^"'\''=]+)["'\'']?=.*/\1/ ' <<< "$line") if [[ -n "$alias_name" ]]; then check_system_command "$alias_name" if [[ -n "${local_aliases[$alias_name]}" ]]; then echo -e "${RED}冲突:别名 [$alias_name] 在行 ${local_aliases[$alias_name]} 和 $line_num 重复定义${NC}" echo "[$file] alias_conflict:$alias_name lines:${local_aliases[$alias_name]},$line_num" >> "$conflict_log" else local_aliases["$alias_name"]=$line_num global_aliases["$alias_name"]+="$file:$line_num " fi fi fi done < "$file" } #------------------------------ # 跨文件冲突检测 check_global_conflicts() { echo -e "\n${CYAN}=== 跨文件冲突扫描 ===${NC}" for name in "${!global_aliases[@]}"; do IFS=' ' read -ra locations <<< "${global_aliases[$name]}" if (( ${#locations[@]} > 1 )); then echo -e "${YELLOW}⚠ 跨文件别名冲突:[$name] 在以下位置定义:" printf " ▷ %s\n" "${locations[@]}" echo -e "${NC}" echo "[跨文件] alias_conflict:$name locations:${locations[*]}" >> "$conflict_log" fi done } main() { while IFS= read -r -d '' file; do process_file "$file" done < <(find "$target_dir" -type f -name "*.sh" -print0) check_global_conflicts echo -e "\n${CYAN}检测完成!详细日志:${conflict_log}${NC}" } main
-
设置执行权限
bashCopy Code
chmod +x check_conflicts_v5.8.sh
三、使用方法
-
基本命令
bashCopy Code
./check_conflicts_v5.8.sh /path/to/scripts
- 参数说明:
/path/to/scripts
:需检测的脚本目录路径6
- 参数说明:
-
测试用例
bashCopy Code
# 创建测试文件 mkdir -p ~/test_scripts cat << EOF > ~/test_scripts/utils.sh alias ls='custom_ls' # 覆盖系统命令 alias docker_ps='docker ps' EOF cat << EOF > ~/test_scripts/main.sh alias grep='ggrep' # 覆盖系统命令 alias docker_ps='docker ps -a' # 跨文件冲突 EOF
-
执行检测
bashCopy Code
./check_conflicts_v5.8.sh ~/test_scripts
-
预期输出
textCopy Code
检测文件:/home/user/test_scripts/utils.sh 警告:别名 [ls] 覆盖系统命令 检测文件:/home/user/test_scripts/main.sh 警告:别名 [grep] 覆盖系统命令 === 跨文件冲突扫描 === ⚠ 跨文件别名冲突:[docker_ps] 在以下位置定义: ▷ /home/user/test_scripts/utils.sh:3 ▷ /home/user/test_scripts/main.sh:4 检测完成!详细日志:conflicts_20250507.log
四、日志文件解析
日志文件 conflicts_YYYYMMDD.log
包含以下三类标记:
- 系统命令冲突
logCopy Code
[系统命令] alias_conflict:ls
- 文件内冲突
logCopy Code
[utils.sh] alias_conflict:docker_ps lines:3,5
- 跨文件冲突
logCopy Code
[跨文件] alias_conflict:docker_ps locations:/test_scripts/utils.sh:3 /test_scripts/main.sh:4
五、故障排查
问题现象 | 解决方案 |
---|---|
未检测到跨文件冲突 | 检查脚本文件名后缀是否为 .sh 6 |
路径含空格报错 | 使用 find -print0 处理特殊路径68 |
系统命令误报 | 通过 type -P 命令名 验证是否为系统内置命令7 |
六、最佳实践
- 命名规范
bashCopy Code
alias myapp_ls='ls -l' # 添加项目前缀避免冲突:ml-citation{ref="7" data="citationList"}
- 冲突修复
- 删除冗余别名:
unalias 别名名
- 集中管理公共别名至
~/.bash_aliases
2
- 删除冗余别名:
注意:脚本默认仅检测
.sh
后缀文件,如需扩展支持其他后缀,可修改find
命令的-name
参数6。
有没有其他类似的Shell脚本冲突检测工具?
DeepSeek-R1满血版 回答完成
深度思考完成 用时18秒
以下是几款与 Shell 脚本冲突检测相关的工具及其特点,涵盖别名冲突、语法检查、静态分析等多种功能:
一、Shell 脚本专用工具
1. ShellCheck(最流行的静态分析工具)
- 官网: ShellCheck – shell script analysis tool
- 功能:
- 检测语法错误(如未闭合的引号、变量作用域问题)
- 发现潜在风险(如
rm -rf /
中的路径错误) - 代码风格建议(如避免
[ $x == "val" ]
,推荐[[ ]]
)
- 安装:
bashCopy Code
# Debian/Ubuntu sudo apt install shellcheck # macOS brew install shellcheck
- 使用示例:
bashCopy Code
shellcheck your_script.sh
- 与别名冲突检测的区别:
ShellCheck 不直接检测别名冲突,但可通过以下规则发现间接问题:shellcheckCopy Code
# SC2142:别名中的空格需引号包裹 alias ls=ls -l # 触发警告
2. Bash-Script-Analyzer
- 仓库: GitHub 开源项目
- 功能:
- 检测未使用的变量和函数
- 检查
shebang
规范(如#!/bin/bash
缺失) - 识别简单的语法错误
- 使用场景:
快速扫描脚本基础问题,适合轻量级检查。
二、通用编程冲突检测工具
1. Checkbashisms
- 功能:
检测脚本中对非 POSIX 标准 Bash 特性的依赖(如[[ ]]
、function
关键字)。 - 安装:
bashCopy Code
sudo apt install devscripts # Debian/Ubuntu
- 使用示例:
bashCopy Code
checkbashisms your_script.sh
2. shfmt(Shell 格式化工具)
- 官网: GitHub - mvdan/sh: A shell parser, formatter, and interpreter with bash support; includes shfmt
- 功能:
- 代码格式化(自动对齐缩进、统一引号风格)
- 简化复杂逻辑的可读性
- 间接帮助发现冲突(格式化后更易人工检查别名重复)
- 安装:
bashCopy Code
go install mvdan.cc/sh/v3/cmd/shfmt@latest
三、自定义冲突检测增强方案
若需检测跨文件别名冲突或系统命令覆盖,可结合以下方法扩展工具链:
1. ShellCheck + 自定义规则
通过 grep
/awk
提取别名并分析:
bashCopy Code
# 提取所有别名定义 find . -name "*.sh" -exec grep -EH '^[[:space:]]*alias ' {} \; > aliases.tmp # 统计重复别名 awk '{print $2}' aliases.tmp | cut -d= -f1 | sort | uniq -d
2. Git 预提交钩子
将检测脚本集成到 Git 工作流:
bashCopy Code
# .git/hooks/pre-commit #!/bin/bash ./check_conflicts_v5.8.sh ./scripts if [ $? -ne 0 ]; then echo "阻止提交:存在脚本冲突!" exit 1 fi
四、工具对比与选型建议
工具 | 核心能力 | 适合场景 |
---|---|---|
自定义检测脚本 | 精准检测别名冲突 | 严格管控别名和命令覆盖的项目 |
ShellCheck | 全面的语法和风格检查 | 日常脚本开发和维护 |
shfmt | 代码格式化 | 团队协作统一代码风格 |
Checkbashisms | 确保 POSIX 兼容性 | 跨平台脚本适配 |
五、总结
- 若需 深度检测别名冲突,您的自定义工具仍是更直接的解决方案。
- 若需 全面代码质量管控,推荐组合:
bashCopy Code
shfmt -i 2 -ci your_script.sh # 格式化 shellcheck your_script.sh # 静态分析 ./check_conflicts_v5.8.sh # 别名冲突检测
shfmt如何帮助发现冲突? 有哪些工具可以帮助检测别名冲突? 有没有在线的Shell脚本冲突检测工具?
DeepSeek-R1满血版 回答完成
深度思考完成 用时27秒,搜索全网28篇资料
一、shfmt 如何帮助发现冲突
shfmt 作为 Shell 脚本格式化工具27,虽不直接检测冲突,但可通过以下方式间接辅助冲突管理:
-
提升可读性
- 自动对齐缩进、统一引号风格,使代码结构清晰,人工检查时更容易发现重复别名或命令覆盖2。
- 示例:格式化后别名定义更易识别
bashCopy Code
# 格式化前 alias ls='custom_ls --color' alias grep='ggrep' # 格式化后(通过 shfmt -i 2) alias ls='custom_ls --color' alias grep='ggrep'
-
统一代码风格
- 避免因风格差异(如
alias
后空格不统一)导致误判冲突7。 - 支持通过
.editorconfig
文件配置团队规范2。
- 避免因风格差异(如
二、别名冲突检测工具
1. ShellCheck
- 核心功能:
- 检测语法错误(如未闭合引号、变量作用域问题)1
- 发现潜在别名问题(如
alias
定义中的空格未转义)16 - 间接辅助冲突检测:通过代码规范提示减少冲突风险
- 示例规则:
shellcheckCopy Code
# SC2142:别名中的空格需引号包裹 alias rm=rm -rf # 触发警告
2. 自定义别名检测脚本
- 实现逻辑:
- 使用
grep
提取所有alias
定义 - 通过
awk
分析重复别名及覆盖系统命令的情况46
- 使用
- 核心代码片段:
bashCopy Code
# 提取别名并统计重复 find . -name "*.sh" -exec grep -h '^alias ' {} \; | awk -F= '{print $1}' | sort | uniq -d
三、在线 Shell 脚本冲突检测工具
1. ShellCheck 在线版
- 地址: ShellCheck – shell script analysis tool
- 功能:
- 实时语法检查与风险提示
- 支持粘贴代码或上传脚本文件17
- 局限性: 需手动排查跨文件冲突
2. shfmt 在线格式化工具
- 地址: https://shfmt.herokuapp.com
- 功能:
- 快速格式化脚本代码
- 辅助人工检查冲突(需结合其他工具)23
工具对比与选型建议
工具/方法 | 冲突检测能力 | 适用场景 |
---|---|---|
ShellCheck | 间接提示潜在冲突风险 | 日常开发中的语法与规范检查 |
自定义脚本 | 精准检测别名重复 | 需要自动化检测别名冲突的项目 |
shfmt | 格式化辅助人工检查 | 团队协作统一代码风格 |
总结
- 若需深度检测别名冲突,推荐组合:
bashCopy Code
# 格式化代码 shfmt -i 2 -ci script.sh # 静态分析 shellcheck script.sh # 自定义检测 ./check_aliases.sh
- 若需快速在线验证,优先使用 ShellCheck 在线版17。
有哪些工具能自动检测别名冲突?
DeepSeek-R1满血版 回答完成
深度思考完成 用时18秒,搜索全网24篇资料
Shell 脚本别名冲突检测工具清单
一、专用检测工具
- ShellCheck(静态分析工具)
- 核心功能13:
- 语法校验(引号闭合、变量作用域)
- 别名定义规范检查(如
alias rm=rm -rf
触发警告 SC2142)
- 安装方法:
bashCopy Code
# Ubuntu/Debian sudo apt install shellcheck # macOS brew install shellcheck
- 使用示例6:
bashCopy Code
shellcheck script.sh # 输出潜在问题及修复建议
- 核心功能13:
二、间接辅助工具
-
shfmt(脚本格式化工具)
- 功能36:
- 自动对齐缩进、统一代码风格
- 提升可读性,便于人工检查别名重复
- 安装:
bashCopy Code
go install mvdan.cc/sh/v3/cmd/shfmt@latest
- 使用示例:
bashCopy Code
shfmt -i 2 -ci script.sh # 格式化后人工检查别名定义
- 功能36:
-
自定义别名检测脚本
- 实现逻辑78:
- 遍历脚本目录,提取所有
alias
定义 - 统计重复别名及覆盖系统命令的情况
- 遍历脚本目录,提取所有
- 核心代码片段:
bashCopy Code
# 提取别名并统计重复 find . -name "*.sh" -exec grep -h '^alias ' {} \; | awk -F= '{print $1}' | sort | uniq -d # 检测系统命令覆盖 for alias_name in $(提取的别名列表); do if type -P "$alias_name" &>/dev/null; then echo "警告:别名 $alias_name 覆盖系统命令" fi done
- 实现逻辑78:
三、集成化解决方案
- Shell 脚本冲突检测工具 v5.8(双冲突修复版)
- 功能:
- 跨文件别名冲突检测
- 系统内置命令覆盖检测
- 使用步骤8:
- 下载脚本
check_conflicts_v5.8.sh
- 执行检测:
bashCopy Code
./check_conflicts_v5.8.sh /path/to/scripts
- 查看日志
conflicts_YYYYMMDD.log
- 下载脚本
- 功能:
工具对比与选型建议
工具/方案 | 检测能力 | 适用场景 |
---|---|---|
ShellCheck | 间接提示别名规范问题 | 日常开发中的代码质量检查 |
自定义脚本 | 精准检测重复别名 | 需要自动化检测的 CI/CD 流程 |
v5.8 工具 | 双冲突检测 | 严格管控别名冲突的项目 |
总结
- 若需快速检测,推荐组合:
bashCopy Code
shellcheck script.sh && shfmt script.sh # 基础检查 + 格式化
- 若需深度检测,优先使用
check_conflicts_v5.8.sh
8,覆盖跨文件及系统命令冲突场景。
如何自定义别名检测脚本?
DeepSeek-R1满血版 回答完成
深度思考完成 用时14秒,搜索全网25篇资料
自定义别名检测脚本实现指南
一、核心逻辑设计
- 遍历脚本文件
- 使用
find
命令定位所有.sh
文件,或指定目录路径46。
- 使用
- 提取别名定义
- 通过
grep
筛选alias
行,并提取别名名称78。
- 通过
- 检测重复别名
- 对提取结果排序后使用
uniq -d
统计重复项67。
- 对提取结果排序后使用
- 检测系统命令覆盖
- 检查别名是否与系统命令同名(如
ls
、rm
)47。
- 检查别名是否与系统命令同名(如
二、基础代码实现
bashCopy Code
#!/bin/bash # 启用别名扩展(Shell脚本默认关闭) shopt -s expand_aliases:ml-citation{ref="6,8" data="citationList"} # 提取所有别名定义并统计重复 alias_temp=$(mktemp) find . -name "*.sh" -exec grep -h '^alias ' {} \; > "$alias_temp" duplicate_aliases=$(awk -F= '{print $1}' "$alias_temp" | sort | uniq -d) # 检测覆盖系统命令 while read -r line; do alias_name=$(echo "$line" | awk '{print $2}' | cut -d= -f1) if type -P "$alias_name" &>/dev/null; then echo "[警告] 别名 $alias_name 覆盖系统命令" fi done < "$alias_temp" # 输出重复别名结果 if [[ -n "$duplicate_aliases" ]]; then echo "发现重复别名:" echo "$duplicate_aliases" else echo "未检测到重复别名" fi rm "$alias_temp"
三、功能增强方向
- 跨文件冲突检测
- 添加参数支持指定扫描目录或文件列表46:
bashCopy Code
# 示例调用 ./check_aliases.sh /path/to/scripts
- 添加参数支持指定扫描目录或文件列表46:
- 过滤内置命令
- 创建系统命令白名单(如
ls
、cp
),仅检测非白名单冲突7。
- 创建系统命令白名单(如
- 生成报告文件
- 输出结果到日志文件,记录冲突详情和时间戳5。
- 集成到 CI/CD
- 在 Git 钩子或流水线中自动执行检测7:
bashCopy Code
# Git 预提交钩子示例 ./check_aliases.sh && git commit
- 在 Git 钩子或流水线中自动执行检测7:
四、注意事项
- 别名扩展问题
- Shell 脚本中默认禁用别名扩展,需通过
shopt -s expand_aliases
显式开启68。
- Shell 脚本中默认禁用别名扩展,需通过
- 脚本执行权限
- 赋予检测脚本可执行权限:
bashCopy Code
chmod +x check_aliases.sh
- 赋予检测脚本可执行权限:
- 多文件处理效率
- 使用
parallel
命令加速大规模文件扫描4:bashCopy Code
find . -name "*.sh" | parallel -j 4 grep '^alias ' {}
- 使用
五、完整增强版脚本示例
bashCopy Code
#!/bin/bash shopt -s expand_aliases # 参数处理 target_dir="${1:-.}" report_file="aliases_report_$(date +%Y%m%d).log" # 定义系统命令白名单 system_cmds=("ls" "cp" "rm" "mv") # 提取别名 alias_temp=$(mktemp) find "$target_dir" -name "*.sh" -exec grep -h '^alias ' {} \; > "$alias_temp" # 检测重复别名 duplicates=$(awk -F= '{print $1}' "$alias_temp" | sort | uniq -d) echo "重复检测结果:" | tee "$report_file" [[ -n "$duplicates" ]] && echo "$duplicates" | tee -a "$report_file" || echo "无重复" | tee -a "$report_file" # 检测系统命令覆盖 echo -e "\n系统命令覆盖检测:" | tee -a "$report_file" while read -r line; do alias_name=$(echo "$line" | awk '{print $2}' | cut -d= -f1) if type -P "$alias_name" &>/dev/null && [[ ! " ${system_cmds[*]} " =~ " $alias_name " ]]; then echo "冲突:别名 $alias_name 覆盖系统命令" | tee -a "$report_file" fi done < "$alias_temp" rm "$alias_temp" echo "检测报告已生成:$report_file"
工具组合推荐
- 代码格式化
bashCopy Code
shfmt -i 2 -ci script.sh # 统一代码风格:ml-citation{ref="4,7" data="citationList"}
- 静态分析
bashCopy Code
shellcheck script.sh # 发现潜在语法问题:ml-citation{ref="6,7" data="citationList"}
- 自定义检测
bashCopy Code
./check_aliases.sh /path # 执行深度别名冲突检测