2014-02-11 43 views
1

昨天我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 

修復了該錯誤,但導致command在後面的子shell返回時運行

所以我想知道最初的例子如何導致首先運行重定向。這是否與>優先於子殼(list)表示法有關?查看BASH手冊頁,我發現

運算符按優先順序進行評估。首先評估 括號中的子表達式,並可以覆蓋上面的優先規則 。

+0

僅供參考,次外層和列表在語法上不同的東西 - 他們有不同的語法規則,儘管使用相同的字符(因而看起來和詞法分析器一樣)。 –

回答

2

200>/var/lock/mylockfile,在此背景下,有關子shell應如何配置(其重定向應該如何設置)。這不是一個單獨的命令。

這是真實的相同的方式,

echo "foo" >bar.txt 

...總是第一個做的重定向,象

>bar.txt echo "foo" 

在這兩種情況都不做爲了在所有問題。

子shell在這方面是相似的 - 它只是一個複合命令,和其他命令一樣,它可以在其開始或結束時指定重定向。

+0

感謝這位查爾斯,我推測我有一個根本性的誤解。我會繼續學習。 – quickshiftin

+3

順便說一下,新版本的bash(4.1+)將爲您分配FD,所以您不必硬編碼數字。因此,你可以使用'{lock_fd}>/path/to/lockfile'和'flock -s'$ lock_fd「' –

+0

整潔,謝謝你的提示 – quickshiftin

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 

現在關於子shell:寫

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

慶典時會自動創建使用fork()一個孩子,那麼孩子重定向至200使用dup2,然後解析和執行(...)中的代碼。

因此,如果你想創建子shell文件之前,一個解決方案是

exec 200> /var/lock/file 
(
    ... 
) >&200 
+0

謝謝Edouard,這也*非常有用。在查看我昨天借用的代碼時,我想知道使用'exec'作爲重定向。我會在這裏仔細研究你的例子。 – quickshiftin

+1

這是'exec'的聖經:http://tldp.org/LDP/abs/html/x17891.html#REDIR1 –

+0

不錯。我想我只需要閱讀高級Bash腳本指南。單獨的手冊會留下一些不足之處。 – quickshiftin