Linux 程序执行后挂起--未完成

Linux 程序执行后挂起--未完成,linux,bash,shell,Linux,Bash,Shell,目前有一个shell程序,用于收集一些用于管理的一般系统信息 问题:在程序执行之后,它似乎挂起并且永远不会完成。在做了一些修补之后,我注意到它似乎在调用“DumpInfo”方法后挂起 # #说明: #收集一般系统信息,然后将信息放入转储文件中 # #用法: #bash getlocal.sh$TMPFILE 2>&1 它正在等待您在readarray上的输入。您可以使用bash-x getlocal.sh

目前有一个shell程序,用于收集一些用于管理的一般系统信息

问题:在程序执行之后,它似乎挂起并且永远不会完成。在做了一些修补之后,我注意到它似乎在调用“DumpInfo”方法后挂起

#
#说明:
#收集一般系统信息,然后将信息放入转储文件中
# 
#用法:
#bash getlocal.sh$TMPFILE 2>&1

它正在等待您在
readarray
上的输入。您可以使用
bash-x getlocal.sh
运行它,以获取调试跟踪日志(该日志将重定向到
TMPFILE
)。如果这并没有使问题变得明显,那么编辑你的帖子并包含日志,顺便说一句,请参阅:关于
函数的
关键字。我强烈建议使用符合标准的XML库来生成XML。如果您想从bash中实现这一点,请将其视为一种易于解析和生成的格式,它可以直接转换为XML,也可以直接转换为XML。试图用
printf
或其他工具生成XML,而这些工具实际上只是进行字符串连接,这充满了微妙的陷阱;同样地,运行
$CMD
本身就有缺陷;请看。我建议删除这个问题,因为如果保留为知识库条目,它的解决方式似乎不太可能帮助其他人。
# 
# Description: 
# Gather general system info then place info in dumpfile
# 
# Usage: 
# bash getlocal.sh < cmds.txt, cmds.txt is a file with a list of commands to run
#
#

function SepCmds() 
{ 
        LCMD=${ALINE%%|*} 
        REST=${ALINE#*|} 
        WCMD=${REST%%|*} 
        REST=${REST#*|}  
        TAG=${REST%%|*} 

        if [[ $OSTYPE == "MSWin" ]] 
        then 
                CMD="$WCMD" 
        else 
                CMD="$LCMD"
        fi
}

function DumpInfo ()
{ 
        printf '<systeminfo host="%s" type="%s"' "$HOSTNAME" "$OSTYPE"
        printf ' date="%s" time="%s">\n' "$(date '+%F')" "$(date '+%T')"
        readarray CMDS
        for ALINE in "${CMDS[@]}" 
        do 
                #ignore comments 
                if [[ ${ALINE:0:1} == '#' ]] ; then continue ; fi 

                SepCmds

                if [[ ${CMD:0:3} == N/A ]] 
                then 
                        continue
                else 
                        printf "<%s>\n" $TAG
                        $CMD
                        printf "</%s>\n" $TAG
                fi
        done 
        printf "</systeminfo>\n"
}

OSTYPE=$(./osdetect.sh) 
HOSTNM=$(hostname) 
TMPFILE="${HOSTNM}.info"

# gather the info into the tmp file; errors as well 
DumpInfo > $TMPFILE 2>&1