Bash脚本中向内嵌Python函数传递变量失败问题排查
问题分析与解决
让我来帮你揪出问题的根源——你的脚本里有两个关键错误,直接导致FULLPATH没被正确传递:
1. FULLPATH的赋值语法完全错误
你写的这一行:
FULLPATH=$ realpath $OUTFILE
这根本不是正确的变量赋值方式!它的实际作用是临时把环境变量FULLPATH设为空字符串,然后执行realpath $OUTFILE命令,完全没有把realpath的输出结果存到FULLPATH里。
另外,你脚本里只定义了DIRIN=$1,OUTFILE变量根本没被初始化,这会导致realpath执行失败(或返回空值)。
正确的写法应该用命令替换,把realpath的输出赋值给变量,同时引用你已经定义的DIRIN:
FULLPATH=$(realpath "$DIRIN")
用$(...)包裹命令是现代bash推荐的写法,比旧的反引号更清晰易读。
2. 变量引用时缺少双引号
调用python_print函数时,你写的是:
python_print $FULLPATH
如果FULLPATH包含空格、特殊字符(比如&、*),bash会把它拆分成多个参数传递给函数,导致$1只拿到路径的一部分,甚至直接为空。
正确的做法是给变量加上双引号,确保路径的完整性:
python_print "$FULLPATH"
修正后的完整脚本
把这两个问题修复后,你的脚本就能正常工作了:
#!/bin/bash function python_print() { PYTHON_ARG="$1" python - <<END import os p = str(os.environ['PYTHON_ARG']) print('The Variable is ' + p) END } DIRIN="$1" # 修正赋值语法,引用正确的变量 FULLPATH=$(realpath "$DIRIN") # 带双引号调用函数,避免路径被拆分 python_print "$FULLPATH"
额外优化:直接传递参数给Python(更简洁)
其实你完全不需要依赖环境变量传递值,直接通过sys.argv把bash参数传给Python脚本会更直观,也避免了环境变量可能带来的冲突:
#!/bin/bash function python_print() { # 把$1作为参数传给Python脚本 python - "$1" <<END import sys if len(sys.argv) > 1: p = sys.argv[1] print('The Variable is ' + p) else: print('No variable provided') END } DIRIN="$1" FULLPATH=$(realpath "$DIRIN") python_print "$FULLPATH"
至于为什么之前替换成$1或硬编码能正常运行?因为$1是脚本的第一个参数,是被正确初始化的变量;而FULLPATH因为赋值错误,根本没有被设置为你期望的路径值,所以Python读取到的是空字符串,自然输出空白。
内容的提问来源于stack exchange,提问作者Stephan H
相关产品推荐
相关产品推荐

