如何在sh中实现类似bash的export -f函数导出功能?
兼容sh的函数共享方案
仅在当前shell使用函数
直接删掉export -f my_function即可。sh环境下用.命令source脚本后,函数会直接加载到当前shell环境里,无需额外导出就能调用。
修改后的my_functions.sh:
#!/bin/sh my_function() { echo 'whatever' }
使用方式不变:
. ./my_functions.sh my_function # 正常输出whatever
需要在子shell中调用函数
sh标准中没有导出函数的机制,可通过环境变量传递函数定义,在子shell里重新加载函数:
- 调整
my_functions.sh,把函数定义存入环境变量:
#!/bin/sh my_function() { echo 'whatever' } # 优先用typeset -f自动获取函数定义,不支持的话手动指定 if command -v typeset >/dev/null 2>&1; then export MY_FUNCTION_DEF="$(typeset -f my_function)" else export MY_FUNCTION_DEF='my_function() { echo "whatever"; }' fi
- 在子shell里先通过
eval重建函数再调用:
. ./my_functions.sh # 子shell中执行 (eval "$MY_FUNCTION_DEF"; my_function)
另一种思路:把函数改成独立脚本
如果函数不需要修改当前shell的环境变量,直接把函数内容做成单独的可执行脚本更简单:
创建my_function文件:
#!/bin/sh echo 'whatever'
给脚本加执行权限:
chmod +x my_function
之后不管是当前shell还是子shell,直接运行./my_function就能用,无需source。
内容的提问来源于stack exchange,提问作者rxFt20
相关产品推荐
相关产品推荐

