子shell优先级

时间:2014-02-11 17:40:28

标签: bash io-redirection subshell

昨天我got some clarification使用flock并且一些简单的概念对我来说变得清晰。

我现在的问题是围绕子弹。看看这个块

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

我的理解是200>/var/lock/mylockfileflock -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联机帮助页,我找到了

  

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

2 个答案:

答案 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