【问题标题】:How to execute new bash command inside shell script file?如何在 shell 脚本文件中执行新的 bash 命令?
【发布时间】:2021-03-29 06:53:38
【问题描述】:

我怎样才能让下面的脚本正常工作?

1  #/bin/bash
2
3  # some commands
4
5  bash
6  # a lot of commands
7  # ...
8  exit
9  
10 bash
11 # A lot of other commands
12 # ...
13 exit
14 
15 exit 0

问题在于,在 shell 中执行脚本时,会进入一个新的交互式 bash shell,并且执行会停在那里等待标准输入。由于子环境在实践中可能不是 BASH,第 4 行和第 9 行中的 bash 命令只是示例,这就是为什么我需要一个新的解决方案,而不是将这些命令放入单独的文件并调用。感谢您的帮助。

【问题讨论】:

  • 问题不是很清楚 - 可能是一些实际的代码和结果会有所帮助。但是,您可以将这些代码 sn-ps 定义为函数并在后台调用该函数-因此其余代码将执行-查看bash.cyberciti.biz/guide/Putting_functions_in_background
  • 你真正想做什么?我非常不清楚您为什么要在 bash 脚本中调用 bash
  • 感谢 Sharad,但功能可能不是这样,因为它无法提供新的执行环境。实际上,当使用 buildah 的 rootless 容器时,必须使用“buildah unshare”进入用户命名空间,然后做一些 mount 和 chroot 的事情。由于 bash/buildah unshare/chroot 都在创建/进入新的子环境,并且它们都具有类似“bash/buildah unshare/chroot -- COMMAND”的语法,其中 COMMAND 可以是任何合法命令或有效脚本(文件)。如果不喜欢脚本文件,还有其他方法可以一次性执行多命令吗?

标签: linux shell script subshell


【解决方案1】:

这是记录在案的行为。如果您只执行bash,您将获得一个交互式shell。如果你想在一个子进程中运行几个 bash 命令——这可能是你想要的,因为你标记了你的问题 subshel​​l,你写

bash FILENAME

其中 FILENAME 是包含命令的文件的名称。如果你想在当前进程中运行几个 bash 命令,你可以写一个

source FILENAME
. FILENAME

source. 之间的差异很小,您可以在 bash man 页面中找到它们的描述。

如果你想在一个子进程中运行多个命令,而不是将它们放入单独的文件中,你可以这样做

(
   some command
   some other command
)

【讨论】:

  • 谢谢,我将其命名为更合理的子环境,并且在 bash 脚本中执行 bash 确实创建了一个子shell,它也是一种子环境。为了更简单(对于子环境,例如 bash/buildah unshare/chroot 等),我按照上面显示的 sn-p 方式进行编码,但它无法按预期工作......
  • Unix / Linux 术语是一个进程。一个进程不是一个环境,但它拥有一个环境。当然,您可以根据需要创建自己的术语,但在与同事讨论技术问题时可能会被误解。
  • @BlaneJohn:见here。我建议你熟悉 Unix 下的进程模型,因为如果你不熟悉,你在编写 shell 程序时迟早会遇到麻烦。
猜你喜欢
  • 1970-01-01
  • 2020-06-24
  • 2019-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-02
  • 2021-02-12
  • 2020-12-08
相关资源
最近更新 更多