2013-12-16 82 views
4

我最近在bash腳本中發現了一個意外的行爲,我想在解決它之前先了解它。這裏有一個簡單的例子:Bash腳本重定向不起作用,爲什麼?

#! /bin/sh 
SCRIPT="/tmp/echoscript.sh >> /tmp/log" 
/bin/sh ${SCRIPT} 

echoscript.sh少了點「回聲‘ABC’」

意外的事情是,「ABC」進入到終端,而不是到/ tmp /日誌文件。這是爲什麼?

如果我改變第三行:

/bin/sh ${SCRIPT} >> /tmp/log 

然後我得到預期的結果; 'abc'進入日誌文件。

回答

3

你不能把重定向放在這樣的變量中。當你做Bash解釋/bin/sh ${SCRIPT},如果你寫道:

/bin/sh "/tmp/echoscript.sh" ">>" "/tmp/log" 

注意如何">>"被引用,殺死了試圖重定向。發生這種情況是因爲Bash分階段解析命令,並且在變量擴展之前解析重定向。變量值不檢查重​​定向。

4

當變量被展開時,結果的唯一進一步處理就是分詞和通配符擴展(又稱通配符)。結果不會掃描其他特殊運算符,如重定向。

如果你想在命令行的充分再處理,你必須使用eval

eval "/bin/sh ${SCRIPT}" 
1

你所期望的,因爲重定向未在$ {} SCRIPT處理這不會做。你會得到/bin/sh: /tmp/echoscript.sh >> /tmp/log: No such file or directory

你需要告訴shell運行前評估$ {} SCRIPT,像這樣:

eval /bin/sh ${SCRIPT} 
$ cat /tmp/log 
abc 
1

另一種方式:

alias SCRIPT="/bin/sh /tmp/echoscript.sh >> /tmp/log" 
SCRIPT 
相關問題