如何编写一个 shell 脚本,让它在脚本中间重新加载终端,然后再次开始使用命令?

如何编写一个 shell 脚本,让它在脚本中间重新加载终端,然后再次开始使用命令?

我最近知道开发者工具gitpod.io我想用这个管理器安装不同的 Java 版本。但我的 sdkman 版本很旧。所以我需要更新它,然后安装 Java。但我不想在 gitpod 中的每个存储库中输入这些命令。这就是为什么我编写了一个 shell 脚本prerequisites.sh,我将在每个存储库中使用此文件。脚本是:-

sdk update
sdk install java 17-open

# there are lots of command under this, but they're not necessary in this question.

但后来我知道更新 sdkman 后,我需要重新启动终端。我发现这exec bash会重新启动终端。但是当我添加exec bash我的 shell 脚本时,它不会执行exec bash命令下面的命令。有人能建议我怎么做吗?

sdk update
exec bash #recently added, but doesn't execute the commands after it :(
sdk install java 17-open

答案1

您遇到的问题是,当您打开新 shell 或重新启动当前 shell 时,您的脚本将不再加载到新 shell 中。因此,您需要做的是:

  1. 打开父 shell
  2. 执行第一个命令
  3. 在父脚本中创建子 shell
  4. 这个子 shell 将加载新的环境参数
  5. 在子 shell 中执行第二条命令
  6. 退出子 shell
  7. 退出父 shell

对于上面提到的命令,您可以使用类似的命令。

#!/bin/bash
sdk update
sudo su - $USER -c 'sdk install java 17-open'

第一个命令将在父 shell 中运行。第二行(使用 sudod su - $USER)将在同一个脚本中打开一个新的子 shell,并执行第二个命令。

PS:如果你没有为 sudo 配置“NOPASSWD”,系统会要求你输入密码。检查进行设置。

相关内容