2016-03-03 55 views
0

我正在寫一個bash樣板文件以在我們的內部項目中重用。其中一項功能是支持noop,調試和記錄到文件的輸出功能。這工作正常,直到我嘗試重定向輸出時使用它。這是我的代碼的當前版本以及一個失敗的示例:如何在bash中使用FD重定向來評估表達式

function output() { 
    if [ "$NOOP" == 'true' ]; then 
     if [ "$DEBUG" == 'true' ]; then 
      echo "$1" |& tee -a $LOGFILE 
     else 
      echo "$1" 
     fi 
    else 
     if [ "$DEBUG" == 'true' ]; then 
      echo "Command: $1" |& tee -a $LOGFILE 
      ($1) |& tee -a $LOGFILE 
     else 
      ($1) 2>&1 >> $LOGFILE 
     fi 
    fi  
} 

output "echo test > test.log" 

任何輸入將不勝感激。

+1

答案在你的標題中:use'eval'。 – Barmar

+0

確實,(eval $ 1)2>&1 >> $ LOGFILE按預期工作。 – m4mush

+0

引用變量,並且不需要將其放在括號中。 – Barmar

回答

1

擴展變量後除了分詞和文件名通配符外,不會處理Shell元字符。所以像>;這樣的字符在那裏沒有任何特殊的含義。

正如您在標題中所說的,您需要使用eval

function output() { 
    if [ "$NOOP" == 'true' ]; then 
     if [ "$DEBUG" == 'true' ]; then 
      echo "$1" |& tee -a $LOGFILE 
     else 
      echo "$1" 
     fi 
    else 
     if [ "$DEBUG" == 'true' ]; then 
      echo "Command: $1" |& tee -a $LOGFILE 
      eval "$1" |& tee -a $LOGFILE 
     else 
      eval "$1" 2>&1 >> $LOGFILE 
     fi 
    fi  
}