【问题标题】:Do bash scripts execute in new shells or subshells?bash 脚本是否在新的 shell 或子 shell 中执行?
【发布时间】:2022-01-19 10:46:37
【问题描述】:

我正在从我的 bash 交互式 shell 运行一个 bash 脚本:

./shell.sh

我的困惑是,这个脚本会在新的 shell 实例中运行,还是在我当前 bash 实例的子 shell 中运行? 我假设从 shell 调用的所有 shell 脚本都在新 shell 中运行,因此它们无法读取调用 shell 的本地 shell 变量。 此外,如果我在调用的脚本中放入“echo $BASH_SUBSHELL”,它会返回一个值“0”,表明它不是子shell。但是根据一些文章,他们说从 shell 执行的 shell 脚本会调用子 shell。请帮忙。

【问题讨论】:

    标签: bash shell scope


    【解决方案1】:

    你是对的;当您使用 ./shell.sh 运行脚本时,它会在新的 shell 中运行,而不是当前 shell 的子 shell。

    它确实在一个子进程中运行,它是一个 shell,所以说“subprocess+shell=subshel​​l,所以它必须是一个子shell!”是一个诱人且常见的错误。但这是不正确的。运行脚本的 shell 不会从父 shell 进程继承 shell 变量(它将继承 environment 变量,即exported 变量,但对于任何子进程都是如此),它不会继承shell模式(例如set -e)或其他shell状态,它甚至不一定运行相同的shell(如果你正在运行bash并且脚本有#!/bin/zsh shebang,它将在zsh中运行) .所以从逻辑上讲,它是一个不同的 shell,只是恰好作为启动它的 shell 的子进程运行。

    【讨论】:

      猜你喜欢
      • 2019-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-17
      • 1970-01-01
      • 1970-01-01
      • 2017-03-27
      • 1970-01-01
      相关资源
      最近更新 更多