I've a bash script, which calls a python script. Python script returns me an object, which I then assign to a variable in bash and have to return.
I am getting command not found when I try to eval the output of the python script. Bash is treating it as a command instead of a value.
Below is the code:
function myfunc()
{
local __resultvar=1ドル
local myresult=$(/home/centos/pentaho2.py)
eval $__resultvar="'$myresult'"
}
myfunc result
echo $result
My python command returns me a value like this:
[('quatre vingt douze ave des champs-élysées', 'road')]
After executing the script, I see this error:
./pentaho2.sh: line 5: vingt: command not found
Could someone help me understand what am I missing here?
-
Have you got #!/usr/bin/python at the start of the Python script? The path needs to be the actual path on your local system.Raman Sailopal– Raman Sailopal2020年11月18日 13:29:56 +00:00Commented Nov 18, 2020 at 13:29
-
Hi @RamanSailopal , yes I've python path present in my script: #!/usr/bin/env python3Logan– Logan2020年11月18日 13:32:56 +00:00Commented Nov 18, 2020 at 13:32
-
The result of your python command contains quotes, which most likely causes the error. I recommend avoiding the whole eval business, as that can cause you a lot of grief if you are new to bash. If you goal is to return some string from a function you should consider using the sub-process approach or simply assigning to a global variable, as those are generally easier to work.hschne– hschne2020年11月18日 14:40:50 +00:00Commented Nov 18, 2020 at 14:40
1 Answer 1
If your bash version is 4.3 or greater, using a nameref in your function allows you to avoid eval and the inherent quoting problems
myfunc() {
local -n __resultvar=1ドル
__resultvar=$(/home/centos/pentaho2.py)
}
myfunc result
echo "$result"
To see the error in action, use set -x:
myresult="[('quatre vingt douze ave des champs-élysées', 'road')]"
set -x
eval result="'$myresult'"
output
+ eval 'result='\''[('\''quatre vingt douze ave des champs-élysées'\'', '\''road'\'')]'\'''
++ result='[(quatre'
++ vingt douze ave des 'champs-élysées, road)]'
A quoting problem indeed.
An alternative is to use declare instead of eval
$ __resultvar=result
$ declare "$__resultvar=$myresult"
$ declare -p result
declare -- result="[('quatre vingt douze ave des champs-élysées', 'road')]"
1 Comment
printf -v "1ドル" "%s" "$(/home/centos/pentaho2.py)" is also an option.