You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

source命令无法识别已存在文件,Shell脚本执行异常求助

问题描述

现有文件结构及脚本执行异常情况如下:

  • items 文件内容:
itemA
itemB
  • itemA.settings 文件内容:
export title="Title itemA"
  • itemB.settings 文件内容:
export title="Title itemB"

执行 configure-all-items.sh 脚本后出现以下问题:

  1. 生成含特殊字符的文件 Title itemA.txt,文件内容为空标题:
Item has title:
  1. Title itemB.txt 内容正常:
Item has title: Title itemB
  1. 执行时报错:line xx: ./../../../itemA: No such file or directory

错误分析与修复方案

1. configure-all-items.sh 脚本错误修复

原脚本存在变量赋值、循环语法及特殊字符处理问题:

  • 变量赋值多写了 $:$itemListDIR="../path" 需改为 itemListDIR="../path"
  • 循环语法错误:for(item in itemList) 不符合Bash语法,改用while read循环可避免换行/隐藏字符问题
  • 未处理文件中可能的空行或特殊换行符

修复后的脚本:

#!/bin/bash

itemListDIR="../path"

# 用while read循环读取文件,跳过空行并保留原格式
while IFS= read -r item
do
    [[ -z "$item" ]] && continue
    echo "Configuring item: $item"
    # 确保调用prepare-item.sh的路径正确,这里假设同目录
    ./prepare-item.sh "$item"
done < "$itemListDIR/items"

2. prepare-item.sh 脚本错误修复

原脚本存在变量赋值、路径解析及特殊字符处理问题:

  • 变量赋值多写了 $:$item="$1" 需改为 item="$1"
  • source 命令可能因工作目录问题找不到settings文件,需用绝对路径定位
  • 未处理item中可能的隐藏特殊字符(如Windows换行符\r),导致解析异常

修复后的脚本:

#!/bin/bash
item="$1"

# 移除item中的隐藏特殊字符(如Windows换行符\r)
item=$(echo "$item" | tr -d '\r')

# 获取当前脚本所在目录,确保能正确找到settings文件
script_dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd)
source "$script_dir/$item.settings"

# 校验title变量是否有效
if [[ -z "$title" ]]; then
    echo "Error: title not set for item $item"
    exit 1
fi

# 生成目标文件
echo "Item has title: $title" > "$title.txt"

3. 特殊字符问题说明

Title itemA.txt 中的特殊字符,大概率是items文件中itemA行末尾带有Windows风格的换行符\r(回车符),导致变量item被解析为itemA\r,进而干扰source命令执行和title变量赋值。修复脚本中添加的tr -d '\r'可移除这类隐藏字符。


内容的提问来源于stack exchange,提问作者Rando Shtishi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 21:05:51