首页 > 解决方案 > Bash 脚本 - 使用 Python 输出时找不到命令错误

问题描述

我有一个 bash 脚本,它调用了一个 python 脚本。Python 脚本返回一个对象,然后我将其分配给 bash 中的一个变量并必须返回。

当我尝试评估 python 脚本的输出时,我收到命令未找到。Bash 将其视为命令而不是值。

下面是代码:

function myfunc()
{
    local  __resultvar=$1
    local  myresult=$(/home/centos/pentaho2.py)
    eval $__resultvar="'$myresult'"
}

myfunc result
echo $result

我的 python 命令返回一个像这样的值:

[('quatre vingt douze ave des champs-élysées', 'road')]

执行脚本后,我看到此错误:

./pentaho2.sh: line 5: vingt: command not found

有人可以帮助我了解我在这里缺少什么吗?

标签: pythonbash

解决方案


如果您的 bash 版本是 4.3 或更高版本,则在函数中使用 nameref 可以避免eval和固有的引用问题

myfunc() {
    local -n __resultvar=$1
    __resultvar=$(/home/centos/pentaho2.py)
}

myfunc result
echo "$result"

要查看操作中的错误,请使用set -x

myresult="[('quatre vingt douze ave des champs-élysées', 'road')]"
set -x
eval result="'$myresult'"

输出

+ eval 'result='\''[('\''quatre vingt douze ave des champs-élysées'\'', '\''road'\'')]'\'''
++ result='[(quatre'
++ vingt douze ave des 'champs-élysées, road)]'

确实是引用问题。


另一种方法是使用declare而不是eval

$ __resultvar=result
$ declare "$__resultvar=$myresult"
$ declare -p result
declare -- result="[('quatre vingt douze ave des champs-élysées', 'road')]"

推荐阅读