1

昨天我得到了一些关于使用的澄清flock,一些简单的概念对我来说变得清晰了。

我现在的问题是关于子壳。看看这个块

(
 flock -s 200 
 # ... commands executed under lock ... 
) 200>/var/lock/mylockfile

我的理解是以前200>/var/lock/mylockfile运行 flock -s 200,但是如果我尝试这样的事情

( echo This is a sub-shell ) command

我从 BASH 收到一个错误

-bash: syntax error near unexpected token `command'

引入分号

( echo This is a sub-shell ); command

修复错误,但导致子外壳返回command运行。

所以我想知道初始示例如何导致重定向首先运行。这与>over sub-shell(list)符号的优先级有关吗?查看 BASH 联机帮助页,我发现

运算符按优先级顺序计算。括号中的子表达式首先被评估,并且可以覆盖上面的优先规则。

4

2 回答 2

2

200>/var/lock/mylockfile是,在这种情况下,有关应如何配置子外壳的信息(应该如何设置其重定向)。这不是一个单独的命令。

这同样适用于

echo "foo" >bar.txt

...总是首先进行重定向,就像

>bar.txt echo "foo"

在这两种情况下,顺序都不重要。

子shell 在这方面是相似的——它只是一个复合命令,并且像任何其他命令一样,它可以在其开头或结尾指定重定向。

于 2014-02-11T18:03:29.177 回答
1

200>/var/lock/mylock;只创造,仅mylock此而已。例如,

$ 200>/var/lock/mylock;
$ echo "hello" >&200
bash: 200: bad file descriptor.

不起作用。如果您希望它运行,请添加 exec :

$ exec 200>/var/lock/mylock;
$ echo "hello" >&200
$ cat /var/lock/mylock
hello

现在关于子壳:写作时

(
   ...
) 200>/var/lock/myfile

bash 创建一个子 using fork(),然后子将 1 重定向到 200 using dup2,然后解析并执行里面的代码( ... )

因此,如果您想在 subshel​​l 之前创建文件,一个解决方案是

exec 200> /var/lock/file
(
  ...
) >&200
于 2014-02-11T18:20:25.457 回答