昨天我got some clarification使用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
修复了错误,但在子shell返回后导致command
运行。
所以我想知道初始示例如何导致重定向首先运行。是否与>
超过子shell (list)
符号的优先级有关?查看BASH联机帮助页,我找到了
按优先顺序评估运算符。中的子表达式 首先评估括号,并可以覆盖优先规则 上方。
答案 0 :(得分:2)
200>/var/lock/mylockfile
是关于如何应该配置子shell的信息(应该如何设置其重定向)。这不是一个单独的命令。
这与
的方式相同echo "foo" >bar.txt
...总是首先进行重定向,就像
一样>bar.txt echo "foo"
在这两种情况下,订单都不重要。
子shell在这方面类似 - 它只是一个复合命令,和任何其他命令一样,它可以在开头或结尾指定重定向。
答案 1 :(得分: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使用fork()
创建一个子项,然后子项使用dup2
将1重定向到200,然后解析并执行( ... )
中的代码。
因此,如果您想在子shell之前创建文件,那么解决方案就是
exec 200> /var/lock/file
(
...
) >&200