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

Bash脚本读取CSV路径时如何正确展开$HOME为有效路径

问题原因

从CSV文件中读取的$HOME属于纯文本字符串,Bash不会自动对普通变量存储的文本内容做变量展开,因此cp命令实际收到的是包含字面量$HOME的路径,系统无法识别该路径导致拷贝失败。

解决方案

方案1:使用envsubst替换环境变量(推荐,安全)

envsubst是专门用于替换文本中环境变量的工具,绝大多数Linux发行版默认预装,不会执行文本中的任意代码,不存在注入风险。
修改后的完整脚本如下:

#!/bin/bash
INPUT=destinations.csv
OLDIFS=$IFS
IFS=','
[ ! -f "$INPUT" ] && { echo "$INPUT file not found"; exit 99; }
while read -r src dest
do
    # 展开路径中的环境变量
    src=$(echo "$src" | envsubst)
    dest=$(echo "$dest" | envsubst)
    cp -- "$src" "$dest"
done < "$INPUT"
IFS=$OLDIFS

注:代码中新增的-r参数、变量双引号、--参数都是为了兼容路径包含空格、特殊字符的场景,避免脚本异常。

方案2:使用eval展开变量(仅适用于完全信任CSV内容的场景)

如果你能确保CSV文件所有内容都是安全的,没有恶意代码,可以用eval强制展开变量:

#!/bin/bash
INPUT=destinations.csv
OLDIFS=$IFS
IFS=','
[ ! -f "$INPUT" ] && { echo "$INPUT file not found"; exit 99; }
while read -r src dest
do
    # 强制展开变量,仅在CSV完全可信时使用
    eval src="$src"
    eval dest="$dest"
    cp -- "$src" "$dest"
done < "$INPUT"
IFS=$OLDIFS

警告:如果CSV中被植入类似$(rm -rf /)的恶意内容,eval会直接执行该命令,导致系统损坏,非必要不推荐使用该方案。

内容的提问来源于stack exchange,提问作者G. Ianni

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 00:39:05