bash - 脚本 - 函数脚本可见性中的分叉(背景)变量
问题描述
如何在块(bash)中的脚本中导出分叉变量?
如果你在块组中创建一个变量 forked,如何取回变量?
unset VAR; { VAR=$( echo "AAAA" ) ;} & PID=$!; echo "[$PID - $VAR]";
只返回PID
[31270 - ]
没有外部文件怎么办?
解决方案
简短的回答:你不能 - 这是不可能的。
一旦 subshell{ VAR=$( echo "AAAA" ) ;}
被分叉出来&
,它就是一个单独的进程,即子进程。它继承了原始 shell 中所有变量的副本,但对这些变量或它创建的新变量的任何或更改都保留在子 shell 中,并且原始(父)shell 无法看到。更重要的是,由于您没有等待孩子完成,因此无法保证孩子甚至会在父母想要使用它的时候设置变量。
将数据从子进程返回给父进程的唯一方法是让进程进行通信——这称为进程间通信 (IPC)。有许多方法可以做到这一点,具有不同的特性,因此对不同任务(以及在 shell 中使用)的适用性不同。
你说你不想使用文件或管道。我不确定为什么会这样(如果您在问题中说会有所帮助),但 IPC 的其他方法包括:
- 套接字(unix 域、TCP 等)
- 先进先出
- 共享内存
- 信号
- 消息队列
- 跟踪
- ETC...
选一个 :)
推荐阅读
- opencv - 即使我安装了它,Make 也不会检测到 opencv_contrib
- java - 为什么它说没有给出论据
- html - Vue.js 输入字段在输入一个字符后失去焦点
- python - python 请求(Accept 标头应该发送一个媒体类型为 application/json)
- wordpress - 如何从 kubernetes shell 获取 Bitnami Wordpress 中的 root 密码?
- javascript - 如何将 cURL 请求转换为 Google Apps 脚本 UrlFetchApp
- go - “下载并安装 32 位 jetbrains 运行时”实际上在 IDE GoLand 中做了什么?
- python - 角哈里斯检测期间出现错误 cv2::cornerEigenValsVecs
- python - 在 Google App Engine 中部署应用程序时出现内存错误
- javascript - 如何在每次迭代的映射函数中找到比较并返回一个元素