2012-04-19 62 views
0

我得到一段用於PID文件控制的代碼。解釋bash的一些提示

程序員的風格,我不明白..

我不知道 - 在

[[ $mypid -ne $procpid ]] **&&** 

>

使用& &

,妥善重新啓動自己(做不適用於MacosX)

$0 [email protected] & 

Code comple TE ...

function createpidfile() { 
    mypid=$1 
    pidfile=$2 
    #Close stderr, don't overwrite existing file, shove my pid in the lock file. 
    $(exec 2>&-; set -o noclobber; echo "$mypid" > "$pidfile") 
    [[ ! -f "$pidfile" ]] && exit #Lock file creation failed 
    procpid=$(<"$pidfile") 
    [[ $mypid -ne $procpid ]] && { 
    #I'm not the pid in the lock file 
    # Is the process pid in the lockfile still running? 
    isrunning "$pidfile" || { 
     # No. Kill the pidfile and relaunch ourselves properly. 
     rm "$pidfile" 
     $0 [email protected] & 
    } 
    exit 
    } 
} 

我迷路

+2

該代碼看起來不錯。我不明白他們爲什麼做了第4行的功能。這應該是一個錯誤,除非這些命令中的一個命令產生了一個他們不應該使用的有效命令名,並且應該引用它,而不是依賴於分詞。它們可能意味着它是一個沒有'$'標記的子shell來隔離noclobber。另外,不要使用'function name(){'語法。如果是Bash,只需使用'name()'。如果你正在做一些不尋常的ksh/bash polyglot庫,使用'function name {'。 – ormaaj 2012-04-19 15:45:20

+3

爲了正確保護帶有空格的參數,將'$ 0 $ @&'更改爲'「$ 0」「$ @」&' - http://www.gnu.org/software/bash/manual/bashref.html#Special - 參數 – 2012-04-19 17:28:24

回答

1

[[ ! -f "$pidfile" ]] && exit的意思是「如果沒有文件名爲$ pidfile進程文件,然後退出」(使用short-circuit evaluation) - exit不會文件是否存在進行評估。

$0 [email protected] &

  • $0 - 在命令行的第一個參數(意味着可執行文件本身);
  • [email protected] - 傳遞到命令行的所有其餘參數;
  • & - 進程發送到發射後的背景。如果
1
command1 && command2 

命令2被執行,且僅當命令1返回零退出狀態。

$0是實際的二進制文件的名稱。

[email protected]是所有參數。

,截止&發送過程中的背景。

一切都在bash manual參見例如記載部3.4.2 Special Parameters

+0

當且僅當command1返回退出狀態of_ ** zero ** - >時,_command2纔會被執行**應該是**非零**(因爲如果'command1'評估爲零,則評估沒有意義'command2' - 表達式保證爲false)。 – 2012-04-19 14:18:59

+0

@AlexanderPavlov - 該行是來自bash手冊的複製粘貼,但是,您當然是正確的。 – 2012-04-19 14:22:36

+0

Ohh ...修復bash手冊的時間... – 2012-04-19 14:23:21

1
  1. &&是邏輯AND

    如果條件[[ $mypid -ne $procpid ]]爲true,則塊{...}中的代碼得到執行。

  2. $0 [email protected] &重新啓動在後臺腳本(具有相同的參數)。

    • $0是調用腳本

    • [email protected]的命令傳遞給腳本

    • &所有的參數列表指示先前的命令應在後臺執行

1

這是boolean short-circuiting - 如果&&(和)運算符之前的位評估爲false,則不需要執行第二部分({}之間的塊。 ||運算符使用相同的技巧,如果第一個塊返回false,那麼它將僅執行第二個塊。