CSH存储Python输出变量时丢失换行符,如何解决?
问题分析与解决方案
问题根源
csh的命令替换(即使用反引号`...`捕获命令输出)会自动将输出中的所有换行符、制表符等空白字符替换为单个空格,导致存储到output变量时,原有的换行信息已经丢失,后续用echo自然无法还原换行。
解决方案
方案1:分场景处理(推荐,无需捕获完整输出)
直接判断输出是否包含setenv,需要执行命令时才捕获输出,输出帮助时直接执行Python脚本,绕开变量存储丢失换行的问题:
修改后的pcmd.csh:
# 定义Python脚本调用命令 set pcmd="./pcmd.py $*" # 检查输出是否包含setenv(用grep的退出状态判断) eval "$pcmd" | grep -q "setenv" if ( $status == 0 ) then # 捕获命令并执行 set output=`eval "$pcmd"` eval "${output}" else # 直接执行脚本输出,保留原始换行 eval "$pcmd" endif
方案2:保留换行到变量(适合必须存储输出的场景)
利用csh的{(f)}变量修饰符,将输出按换行分割为数组,从而保留换行结构:
修改后的pcmd.csh:
# 定义Python脚本调用命令 set pcmd="./pcmd.py $*" # 用(f)修饰符按换行分割输出为数组,保留换行信息 set output=(${(f)"`eval "$pcmd"`"}) if ( "$output" =~ *setenv* ) then # 将数组合并为命令字符串(换行替换为分号) set cmd_str=`echo "$output" | tr '\n' ';'` eval "${cmd_str}" else # 遍历数组逐行输出,还原换行 foreach line ($output) echo "$line" end endif
补充说明
Python脚本的输出本身是正确的(包含\n换行符),问题完全来自csh命令替换的默认行为——它会将所有空白字符(包括换行)统一替换为单个空格,导致换行丢失。
内容的提问来源于stack exchange,提问作者DDStackoverflow
相关产品推荐
相关产品推荐

