0

我一直在整理一个 bash 脚本,该脚本接受一个 ini 文件(具有我一直在与脚本一起开发的格式)并通读该文件,执行指定的操作。

ini 格式的函数之一允许使用eval. 当命令包含变量名时,我遇到了问题。

eval(或一般的外壳)似乎没有正确替换值,并且大多数时候它似乎用空格替换所有变量名,从而破坏了命令。创建字符串输出的子shell 似乎也有同样的问题。

奇怪的是,这在我的开发机器上运行(运行 linux mint 13),但是当我将脚本移动到运行 CentOS 5.8 的目标机器时,这些问题就出现了。

我从 ini 文件中读取的一些代码示例:

shellcmd $toolspath/program > /path/file

shellcmd parsedata=$( cat /path/file )

这些通过一个脚本函数剥离前导shellcmd,然后使用 evals 字符串

eval ${scmd}

关于可能导致奇怪行为的原因以及我可以尝试解决问题的任何想法?我的最终目标是能够从文件中读取一行并让我的脚本执行它,并能够正确处理读取命令中的脚本变量。

4

2 回答 2

0

我为导致此问题的一个命令找到了合适的替代方法,因此我将此问题标记为已解决。

从我所有的调查来看,我似乎在 bash shell 中发现了一个不为人知的错误。我试图评估的特定命令在其输出中返回了一个终端代码,并且由于 shell 处于读取循环中,输入从文件重定向,因此导致了一些奇怪的行为。我的解决方案是将对该特定命令的调用移到读取循环之外。它仍然没有解决根本问题,我认为这是 bash shell 中的一个错误。希望这会帮助遇到同样(晦涩)问题的其他人。

于 2012-09-15T00:24:48.693 回答
0

使用 Bash 3.2.25 (CentOS 5) 我试过这个,它工作正常:

toolspath='/bin'
while read prefix scmd
do
    if [[ $prefix == 'shellcmd' ]]
    then
        echo "Evaluating: <$scmd>"
        eval ${scmd}
    else
        echo "$prefix ignored"
    fi
done < ini

和:

shellcmd $toolspath/ls > /home/user1/file     
shellcmd parsedata=$( cat /home/user1/file )
shellcmd echo $parsedata

我显然必须设置路径。很可能您在切换机器时必须更改路径。你的路径有嵌入空间吗?

你是如何传输文件的?你可能是通过 Windows 去的吗?一时兴起,我unix2dosini文件上做了一个,我得到了与你描述的相似的症状。这是我最好的猜测。

于 2012-09-14T11:55:15.033 回答