群殴奇怪的先有鸡还是先有蛋的问题

群殴奇怪的先有鸡还是先有蛋的问题

此 bash 命令的不同步骤按什么顺序完成:

(flock -n 9) 9> toto.txt

如果我只做子外壳部分:

(flock -n 9)

我得到这个结果:( flock: 9: Mauvais descripteur de fichier错误的文件描述符)。

因此,我假设子 shell 生成首先使用(...) 9> toto.txt.打开文件描述符 9。

但如果我这样做:

(ls -l /proc/$$/fd) 9> toto.txt 
total 0
lrwx------ 1 laurent laurent 64 déc.  16 00:24 0 -> /dev/pts/2
lrwx------ 1 laurent laurent 64 déc.  16 00:24 1 -> /dev/pts/2
lrwx------ 1 laurent laurent 64 déc.  16 00:24 2 -> /dev/pts/2
lrwx------ 1 laurent laurent 64 déc.  16 00:24 255 -> /dev/pts/2

文件描述符 9 未列出。那么看来是flock负责打开它?

有人可以解释子外壳内部和外部之间“握手”的步骤及其顺序吗?

答案1

对比如下:

sh -c 'ls -l /proc/$$/fd' 9>/tmp/toto.txt
total 0
lrwx------ 1 chris chris 64 Dec 16 11:24 0 -> /dev/pts/0
lrwx------ 1 chris chris 64 Dec 16 11:24 1 -> /dev/pts/0
lrwx------ 1 chris chris 64 Dec 16 11:24 2 -> /dev/pts/0
l-wx------ 1 chris chris 64 Dec 16 11:24 9 -> /tmp/toto.txt

sh -c "ls -l /proc/$$/fd" 9>/tmp/toto.txt
total 0
lrwx------ 1 chris chris 64 Dec 16 11:24 0 -> /dev/pts/0
lrwx------ 1 chris chris 64 Dec 16 11:24 1 -> /dev/pts/0
lrwx------ 1 chris chris 64 Dec 16 11:24 2 -> /dev/pts/0
lrwx------ 1 chris chris 64 Dec 16 11:25 255 -> /dev/pts/0

( ls -l /proc/$$/fd ) 9>/tmp/toto.txt        # Your own example
total 0
lrwx------ 1 chris chris 64 Dec 16 11:24 0 -> /dev/pts/0
lrwx------ 1 chris chris 64 Dec 16 11:24 1 -> /dev/pts/0
lrwx------ 1 chris chris 64 Dec 16 11:24 2 -> /dev/pts/0
lrwx------ 1 chris chris 64 Dec 16 11:25 255 -> /dev/pts/0

在第一个示例中,$$属于子 shell。在第二种情况下,也是针对您自己的情况,$$父外壳命令执行之前。

现在回答你原来的问题,

此 bash 命令的不同步骤按什么顺序完成: (flock -n 9) 9> toto.txt

这是由 POSIX 定义:

  1. shell 从文件(请参阅 sh)、-c 选项或 POSIX.1-2017 系统接口卷中定义的 system() 和 popen() 函数读取其输入。如果 shell 命令文件的第一行以字符“#!”开头,则结果未指定。
  2. shell 将输入分解为标记:单词和运算符;请参阅令牌识别。
  3. shell 将输入解析为简单命令(请参阅简单命令)和复合命令(请参阅复合命令)。
  4. shell 对每个命令的不同部分(分别)执行各种扩展,从而产生被视为命令和参数的路径名和字段列表;参见wordexp。
  5. shell 执行重定向(请参阅重定向)并从参数列表中删除重定向运算符及其操作数。
  6. shell 执行函数(请参阅函数定义命令)、内置函数(请参阅特殊内置实用程序)、可执行文件或脚本,以编号为 1 到 n 的位置参数形式给出参数名称,以及命令名称(或者对于脚本内的函数,脚本的名称)作为编号为 0 的位置参数(请参阅命令搜索和执行)。
  7. shell 可以选择等待命令完成并收集退出状态(请参阅命令的退出状态)。

相关内容