首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >子炮弹的执行命令?

子炮弹的执行命令?
EN

Stack Overflow用户
提问于 2018-08-31 11:03:42
回答 1查看 330关注 0票数 1

在试图解决其他问题时,我在Alex在this question中的答案中遇到了以下bash脚本

代码语言:javascript
复制
#!/bin/bash

(
  # Wait for lock on /var/lock/.myscript.exclusivelock (fd 200) for 10 seconds
  flock -x -w 10 200 || exit 1

  # Do stuff

) 200>/var/lock/.myscript.exclusivelock

我很难理解那个剧本。根据flock's手册,flock -x -w 10 200中的文件描述符( 200)必须与打开的文件相关联。

描述符/文件在哪里打开?如果打开描述符的是200>/var/lock/.myscript.exclusivelock,这意味着这个部分在子subshell之前执行,这与我最初查看这个脚本时所想的正好相反。

这就引出了我的问题: bash中的子spawn的执行顺序是什么,相对于主脚本(即打开子spawn的脚本)以及同一主脚本可能生成的其他子spawn,执行顺序是什么?

通过阅读其他文章和bash手册,我相信我只知道子subshell是“并发”执行的,但我没有看到任何说明是否有注释的声明(一个明显的例外是主脚本需要子subshell的输出,比如echo foo $(cat bar))。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-31 11:14:14

重定向操作符200>使用描述符200打开文件。它确实是在子外壳之前处理的。然后,该文件描述符由子subshell继承。

子There本质上没有任何并发性。您可能会想到管道,比如a | b | c,其中abc都是并发运行的命令。每个程序都在子shell中运行(如果它们是外部命令,则通常是子进程本身,但即使是在子shell中执行的shell内置程序)是管道的实现细节。

为了详细说明,

  1. 首先,shell解析此命令。它使用输出重定向标识复杂命令(...)
  2. 它在文件描述符200上以写模式打开/var/lock/.myscript.exclusivelock
  3. 它执行子subshell,它继承所有打开的文件描述符,包括200个。
  4. 在子subshell中,它执行flock,从其父子subshell继承所有打开的文件描述符。它按照参数的要求,在文件描述符200上执行它的操作。
  5. 一旦子shell退出,它的重定向操作符打开的任何文件都会被shell关闭。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52114098

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档