能否将set +h的效果继承给子进程?调用脚本继承失效的解决办法
如何让子shell脚本继承
set +h的效果 我之前也碰到过类似的困惑,其实核心问题在于shell选项默认不会自动被子进程继承,而且导出SHELLOPTS变量并不能解决这个问题——因为SHELLOPTS只是当前shell用来跟踪自身选项的内部变量,子shell启动时并不会根据这个变量的值来同步设置选项。下面给你几个可行的解决方案:
方案1:调用子脚本时显式指定+h选项
如果你的被调用脚本是bash脚本,可以直接在调用时通过命令行参数让子shell启动就关闭哈希表功能:
# 在call脚本里这样调用called bash +h ./called
这种方式不需要修改被调用的called脚本,直接通过启动参数强制子shell应用+h选项,是最直接的办法。
方案2:在被调用脚本开头添加set +h
如果你有权限修改called脚本,可以在它的最开头(#!/bin/bash之后)加上:
set +h
这样不管哪个父进程调用它,脚本都会主动关闭哈希表,确保效果生效。
方案3:通过环境变量传递触发信号(需子脚本配合)
如果不能修改called脚本,但它是bash脚本,可以在父脚本里导出一个自定义环境变量,然后让子脚本根据这个变量自动设置选项:
- 在
call脚本中添加:
export ENABLE_NO_HASH=1
- 在
called脚本开头添加(如果能修改的话):
if [ -n "$ENABLE_NO_HASH" ]; then set +h fi
这个方案需要子脚本的配合,适合你能控制两个脚本的场景。
另外补充一点:bash的shell选项继承只有在使用**子shell(即用括号()包裹的命令)**时才会部分继承,但独立启动的脚本是全新的shell进程,不会继承父shell的选项,所以必须通过上面的方式主动传递设置。
内容的提问来源于stack exchange,提问作者René Nyffenegger
相关产品推荐
相关产品推荐

