【问题标题】:Script - Forked (background) variable in function script visibility [duplicate]脚本 - 函数脚本可见性中的分叉(背景)变量
【发布时间】:2021-08-23 10:50:55
【问题描述】:

如何在块 (bash) 中的脚本中导出分叉变量?

如果你在block group forked中创建了一个变量,如何取回这个变量?

unset VAR; { VAR=$( echo "AAAA" ) ;} & PID=$!; echo "[$PID - $VAR]";

只返回 PID

[31270 - ]

如何做到没有外部文件?

【问题讨论】:

  • (direct shell) 你在运行命令之前已经设置了变量VAR。 unset VAR 运行前。 IE。 - 无法重现,我在这两种情况下都只看到 VAR。 How to do it? 将值写入文件。从父 shell 读取文件。
  • @KamilCuk 如果我也这样做unset VAR。还编辑了问题并添加到命令以完成它。我不想使用外部文件。只有变量plz的解决方案
  • 我也尝试在“直接外壳”示例中粘贴您的确切代码,但它不起作用。请再试一次。
  • @psmears “我也尝试在“直接外壳”示例中粘贴您的确切代码,但它不起作用。请再试一次。”我之前编辑过问题
  • @KamilCuk “如何在没有外部文件的情况下做到这一点?你尝试过什么,做了哪些研究?”我想你在肤浅地谈论我。谢谢你。

标签: bash macos shell


【解决方案1】:

简短的回答:你不能——这是不可能的。

一旦子shell { VAR=$( echo "AAAA" ) ;} 与& 分叉,它就是一个单独的进程,即子进程。它继承了原始 shell 中所有变量的副本,但对这些变量或它创建的新变量的任何或更改都保留在子 shell 中,并且原始(父)shell 无法看到。更重要的是,由于您没有等待孩子完成,因此无法保证孩子甚至会在父母想要使用它的位置设置变量。

将数据从子进程返回到父进程的唯一方法是让进程进行通信 - 这称为进程间通信 (IPC)。有很多方法可以做到这一点,具有不同的特征,因此对不同任务(以及在 shell 中使用)的适用性也不同。

您说您不想使用文件或管道。我不确定这是为什么(如果您在问题中说会有所帮助),但其他 IPC 方法包括:

  • 套接字(unix 域、TCP 等)
  • 先进先出
  • 共享内存
  • 信号
  • 消息队列
  • ptrace
  • 等等……

选择一个:)

【讨论】:

  • “Sockets FIFOs Shared memory Signals Message queues ptrace Pick one :)”。子进程和父进程让我抓狂。变数也。认为你的答案是正确的。尝试了很多,但这是不可能的。共享内存目录从操作系统更改为操作系统。信号和 ptrace 不知道是什么(我要研究)。使用管道(没有外部文件)我不知道该怎么做。我认为唯一的答案是套接字或 FIFO。外部文件也很难放置。正在努力。 (公认)。谢谢
猜你喜欢
  • 2022-12-04
  • 2019-09-17
  • 1970-01-01
  • 2011-05-01
  • 2011-12-29
  • 2010-09-25
  • 2019-04-27
  • 2011-09-22
  • 2016-11-01
相关资源
最近更新 更多