无法从Bash脚本读取函数,需调用指定函数技术求助
我来帮你一步步搞定这两个Bash脚本的问题,咱们逐个拆解:
一、解决无法从Bash脚本读取函数的问题
你遇到的“无法读取函数”,大概率是因为没在main.sh里正确加载genericfunctions.sh的函数定义。Bash中如果直接执行另一个脚本,会启动子Shell运行,子Shell里的函数不会传递到当前Shell环境。正确的做法是用source命令(或简写为.)在当前Shell环境中加载脚本:
在main.sh的开头添加一行:
# 若两个脚本在同一目录下,用相对路径即可 source ./genericfunctions.sh # 要是路径不确定,用绝对路径更稳妥,比如: # source /your/full/path/genericfunctions.sh
这样main.sh就能访问genericfunctions.sh里定义的所有函数了。另外要确认genericfunctions.sh有可读权限(默认一般都有,要是没有就用chmod +r genericfunctions.sh调整)。
二、解决执行脚本时仅触发特定函数的问题
你说执行./tmp/file1.sh会触发所有函数,这说明脚本里的函数定义之后,直接写了函数调用代码(比如定义完funcA就直接写funcA)。要实现“仅调用指定函数”,可以给脚本加参数判断逻辑,让它只在收到指定函数名时才执行对应逻辑:
修改file1.sh的内容,添加以下核心逻辑:
#!/bin/bash # 这里是你的函数定义 func1() { echo "执行func1的业务逻辑" } func2() { echo "执行func2的业务逻辑" } # 关键判断:只有当脚本被直接执行时,才根据参数调用指定函数 if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then # 检查是否传入了函数名参数 if [[ $# -ne 1 ]]; then echo "用法:$0 <要调用的函数名>" >&2 exit 1 fi # 验证指定的函数是否存在 if declare -f "$1" > /dev/null; then # 调用目标函数 "$1" else echo "错误:脚本中不存在名为$1的函数" >&2 exit 1 fi fi
现在执行脚本时,只要传入函数名就能只触发特定函数:
# 仅执行func1 ./tmp/file1.sh func1 # 仅执行func2 ./tmp/file1.sh func2
如果之后需要在其他脚本(比如main.sh)里调用file1.sh的函数,同样用source ./tmp/file1.sh加载,然后直接调用func1或func2即可,不会触发多余的执行逻辑。
针对你的报错补充
你提到的报错“Bootstrap complete: None of the functions from file1 are being called from file2”,结合上面的方法,先确认main.sh里是否正确source了genericfunctions.sh,然后检查是否在source之后调用了需要的函数。比如:
# main.sh示例 #!/bin/bash source ./genericfunctions.sh # 调用你需要的函数(替换成实际函数名) bootstrap_init
内容的提问来源于stack exchange,提问作者Bobby

