在试图解决其他问题时,我在Alex在this question中的答案中遇到了以下bash脚本
#!/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))。
发布于 2018-08-31 11:14:14
重定向操作符200>使用描述符200打开文件。它确实是在子外壳之前处理的。然后,该文件描述符由子subshell继承。
子There本质上没有任何并发性。您可能会想到管道,比如a | b | c,其中a、b和c都是并发运行的命令。每个程序都在子shell中运行(如果它们是外部命令,则通常是子进程本身,但即使是在子shell中执行的shell内置程序)是管道的实现细节。
为了详细说明,
(...)。/var/lock/.myscript.exclusivelock。flock,从其父子subshell继承所有打开的文件描述符。它按照参数的要求,在文件描述符200上执行它的操作。https://stackoverflow.com/questions/52114098
复制相似问题