【问题标题】:Does git bash create a subshell by default when running a script file?git bash 在运行脚本文件时是否默认创建子shell?
【发布时间】:2021-12-02 04:36:26
【问题描述】:

我正在探索一下 shell 脚本并编写了这个脚本。当构建命令失败时,它必须提供错误消息并退出。

我知道出口 1 会关闭它正在运行的当前 shell。并且 exit 语句在花括号内(意味着它在同一个 shell 上执行)。但是当这个脚本以./testScript.sh 运行时,它会停止执行test(),不会调用testTwo(),并且终端保持打开状态。

虽然这正是我正在寻找的功能,但我的问题是它为什么不关闭终端,因为出口 1;命令? git bash 在运行脚本时是否默认创建子shell?

我知道它不是因为它在函数中被调用。我确实尝试在没有函数的情况下在脚本中运行 exit 语句,但它仍然没有关闭终端。

任何关于 git bash 和 exit 命令实际工作的见解都会非常有用。

谢谢!

# testScript.sh

function test() {
    dotnet build -c Debug sample.csproj || { echo -e "${RED}=== Build Failed";  exit 1; }
}

function testTwo() {
    echo "== executing test two function."
}

function all()
{
    pushd .
  test
  testTwo
    popd
}

all "$@"

【问题讨论】:

  • 你的脚本没有shebang。你确定可以以./testScript.sh 运行它吗?
  • 脚本作为子进程运行,但这与子shell不同。
  • 另外,“sn-p”按钮仅适用于 HTML + JavaScript。使用{} 按钮格式化其他语言的代码。
  • 无论如何——因为你使用的是 bash-only 语法,所以这不是一个正确的 sh 脚本——它特别是一个 bash 脚本;并非所有 sh 副本都会运行它。确实,最好不要在可执行文件名称上使用扩展名——如果您使用 shebang 指定解释器,您可以随意更改该解释器,而无需重命名文件,从而修改调用它的程序。另请参阅Commandname extensions considered harmful

标签: bash git-bash exit subshell


【解决方案1】:

git bash 在运行脚本时是否默认创建子shell?

它不是( ) 中的“子shell”。 shell spawns 一个单独的 process 执行命令。该进程不继承bash变量和函数,只继承exported变量,即它不是子shell。

不要使用function name(),只使用name()。见https://wiki.bash-hackers.org/scripting/obsolete。使用 shellcheck.net 检查脚本。

【讨论】:

  • 谢谢!是的,我确实注意到执行创建了新进程。所以 exit 语句会杀死进程,从而停止执行并且终端没有关闭。但是为什么它不执行第二个函数,我假设它也应该在一个新进程上?
  • m assuming it too should be on a new process? 正如您的观察所暗示的那样,您的假设是无效的。函数在当前shell中执行。
  • @NivedithaKarmegam 第二个函数是否作为子进程运行无关紧要,因为脚本在启动之前就退出了。当它退出时,它会停止执行test 函数、调用它的all 脚本, testScript.sh 文件的主序列。
猜你喜欢
  • 2018-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-03
  • 2013-01-19
  • 2012-11-16
  • 2012-06-18
  • 1970-01-01
相关资源
最近更新 更多