代码之家  ›  专栏  ›  技术社区  ›  Binarus

子壳的执行顺序?

  •  0
  • Binarus  · 技术社区  · 6 年前

    bash 脚本在亚历克斯B的答案中 this question

    #!/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 手动,文件描述符 200 )在 flock -x -w 10 200 必须与 打开

    描述符/文件在哪里打开?如果它是 200>/var/lock/.myscript.exclusivelock 这将打开描述符,这意味着这部分被执行 子shell,这与我最初看这个脚本时的想法相反。

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

    echo foo $(cat bar) ).

    1 回复  |  直到 6 年前
        1
  •  1
  •   chepner    6 年前

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

    子shell没有内在的并发性。你可能在想 a | b | c ,在哪里 a b ,和 c 是同时运行的所有命令。每一个都在子shell中运行(如果它们是外部命令,则通常是子进程本身,但即使shell内置也在子shell中执行),这是管道的一个实现细节。


    详细说明一下,

    1. (...) 具有输出重定向。

    2. 它打开了 /var/lock/.myscript.exclusivelock 在文件描述符200上处于写入模式。

    3. 它执行subshell,它继承所有打开的文件描述符,包括200个。

    4. flock ,它从继承所有打开的文件描述符 它的 家长,地下室。它在文件描述符200上执行它的操作,正如它的参数所要求的那样。

    5. 一旦子shell退出,由它的重定向操作符之一打开的任何文件都将被shell关闭。