【问题标题】:What does `exec 200>lockfile` do?`exec 200>lockfile` 有什么作用?
【发布时间】:2020-07-17 20:09:39
【问题描述】:

我不熟悉exec 命令。关于如何锁定文件的 bash 教程抛出了这个:

exec 200>lockfile 
flock 200
...
flock -u 200

我知道它正在创建一个名为 lockfile 的文件并为其分配 FD 200。然后第二个命令锁定该文件。处理完文件后,最后一个命令将其解锁。

这样做,同一脚本的任何其他并发实例将停留在第二行,直到第一个实例解锁文件。很酷。

现在,我不明白exec 在做什么。

直接从 bash 命令行,这两个选项似乎都有效:

exec 200>lockfile
200>lockfile

但在脚本中使用第二个选项时,会引发“错误的文件描述符错误”。

为什么需要exec 来避免错误?

--- 编辑---

经过一些更“认真的研究”,我找到了答案hereexec 命令使 FD 停留在整个脚本或当前 shell 中。

这样做:

200>lockfile flock 200

会工作的。但后来flock -u 200 会引发“Bad FD error”。

【问题讨论】:

  • 手册中还说如果没有指定命令,任何重定向都在当前shell中生效。你在这里问什么?
  • @oguzismail 是试图回答吗?它没有帮助。如果你是反对者,我很高兴知道为什么,这样我就可以改进这个问题......
  • 这是一条粗鲁的评论。是的,我是,我投了反对票,因为这个问题没有显示出任何认真研究的迹象。
  • 在这里找到了一个很好的答案:tldp.org/LDP/abs/html/x17974.html

标签: bash exec


【解决方案1】:

手册似乎提到了用给定命令替换 shell。这和文件描述符有什么关系?

这在第二句中解释:

exec: exec [-cl] [-a name] file [redirection ...]
    Exec FILE, replacing this shell with the specified program.
    If FILE is not specified, the redirections take effect in this
    shell. [...]

基本上,从myscript.sh 内部执行exec 42> foo.txt 会打开foo.txt,以便在当前进程中写入FD 42。

这类似于首先从 shell 运行 ./myscript.sh 42> foo.txt,或者在 C 程序中使用 opendup2

【讨论】:

    猜你喜欢
    • 2012-01-07
    • 2015-10-11
    • 2012-12-11
    • 2012-08-03
    • 2023-01-31
    • 2023-02-14
    • 2018-12-11
    • 1970-01-01
    相关资源
    最近更新 更多