bash函数在终端运行正常,调用.sh脚本中定义的函数提示找不到命令
问题产生原因
你在终端直接定义函数时,函数会被注册到当前交互shell的运行环境中,所以当前shell能识别到函数名,调用可正常执行。
而你将函数写入.sh脚本后存在两个核心问题:
- 默认直接运行脚本(或者脚本没有被加载到当前shell时),系统会启动一个独立的子shell进程执行脚本内容,子shell中定义的函数仅在子进程运行期间有效,脚本执行完子进程就会销毁,你当前操作的父shell完全不会继承子shell里的函数定义,直接调用函数名当前shell自然找不到对应命令。
- 你当前编写的脚本仅完成了函数定义,没有写调用函数的逻辑,就算直接执行脚本
./hello_world2.sh也不会有任何输出。
解决方法
根据你的使用场景可以选择以下三种方案:
场景1:仅需要当前终端会话临时可用该函数
用source或.命令加载脚本,脚本内容会直接在当前shell环境中执行(不会启动子shell),函数就会被注册到当前shell:# 两种写法等价 source hello_world2.sh # 或者 . hello_world2.sh加载完成后直接调用
hello_world2即可正常输出。场景2:不需要在终端复用函数,仅运行脚本时执行函数逻辑
直接在脚本末尾新增函数调用代码,修改后的脚本内容如下:#!/bin/bash hello_world2 () { echo ' hello world this is 2022' ; } # 新增调用逻辑 hello_world2给脚本添加执行权限后直接运行脚本即可:
chmod +x hello_world2.sh ./hello_world2.sh场景3:需要所有终端会话永久可用该函数
把函数定义直接写入你当前使用的shell配置文件中:
如果你用的是报错里的zsh,写入~/.zshrc;如果用的是bash,写入~/.bashrc。
写入完成后执行source ~/.zshrc(对应你自己的shell配置文件)立即生效,后续任何终端都可以直接调用hello_world2函数。
内容的提问来源于stack exchange,提问作者Alhu.A
相关产品推荐
相关产品推荐

