我正在编写一个用于安装环境管理器的 bash 脚本,但这意味着我必须在多个目录中安装某些内容。看看我的另一个问题更多细节。但这让我重新思考我的方法。
我现在正在考虑将其制作为 3 个独立的 bash 脚本。然后一个人就会打电话给另一个人。事情是这样的:我需要source .bash_profile
在父 shell 中进行一些操作。问题是,在 bash 脚本中调用的 bash 脚本是否会在新 shell 或父 shell 中运行,或者是否会在父 shell 内的主机 bash 脚本 shell 内的新 shell 中运行?
“shell-ception”我知道它正在烹饪我的大脑。我真的很想自动化这个过程,这就是我面临的墙。
答案1
如果您在 shell 中执行命令,则该命令始终作为该 shell 的子进程执行,除非
- 它是一个内置的 shell(如
cd
) - 它的来源是 (
. /path/to/file
,source /path/to/file
) - 它是通过执行的
exec
您可以使用 轻松检查ps -e -o pid,ppid,user,args
。
source .bash_profile
仅当变量已标记为导出时才影响子 shell(请参阅declare -x
)。
答案2
这是实际差异:
运行命令使 shell 创建一个子进程。先前在子进程中定义的任何环境变量都将丢失给父进程。
使用
source
脚本强制在当前进程(父进程内)运行。然后,脚本中的环境变量将保留。