2017-01-26 96 views
0

Im修改負責安裝的shell腳本。腳本有幾個功能,所有的輸出都必須重定向到一個日誌文件。 但是,在每個功能的開始,我必須在終端打印一些類似「啓動功能」的東西。會發生什麼呢,當我在一個代碼塊中調用一個函數時,因爲我將該代碼塊的輸出重定向到一個日誌文件,所有東西都被重定向,甚至是我想要在終端中顯示的第一個信息。一個功能的Shell腳本 - 強制輸出到函數內的命令行

實施例:

 echo -n "running script" 

     if ( { 
        command1 && function_xpto; 
       } >> $LOG_FILE 2>&1 
      ); 
     then 
      echo "SUCCESS" 
     else 
      echo "FAILED" 
      exit 1 
     fi; 

當我調用的代碼塊,裏面的一切功能(我明白:對函數的調用的

function_xpto() { 
     echo -n "starting function ...." 

     if ( { 
        command1 && command2 && ... && commandN; 
       } >> $LOG_FILE 2>&1 
      ); 
     then 
      echo "SUCCESS" 
     else 
      echo "FAILED" 
      exit 1 
     fi; 
} 

實施例爲什麼)被重定向。

所以,我想強制一個命令(例如:回聲)發送到終端,或至少,不要發送到日誌文件。

在此先感謝。

回答

1

/dev/tty爲過程控制終端,如果它有一個。

function_xpto() { 
     echo -n "starting function ...." > /dev/tty 

     if ( { 
        command1 && command2 && ... && commandN; 
       } >> $LOG_FILE 2>&1 
      ); 
     then 
      echo "SUCCESS" 
     else 
      echo "FAILED" 
      exit 1 
     fi; 
} 
+0

謝謝。有一個問題,它強制發送到終端?或者發送到終端和日誌文件? –

+0

只是終端。如果你想發送相同的輸出到兩個不同的文件,你需要使用'tee':'echo -n「Starting function ...」| tee -a/dev/tty'將'echo'的輸出發送到'/ dev/tty'和標準輸出可能是),'tee'把它的標準輸入寫到標準輸出(就像'cat'一樣),而且也寫入任何名字作爲參數傳遞的文件,'-a'選項確保所有命名文件被附加到,而不是用'/ dev/tty','-a'可能是不必要的,因爲你不能截斷那個特定的設備。 – chepner

+0

謝謝。我剛開始學習她兩天前,所以幾乎所有的東西都是我的新東西。謝謝 –

-1
echo -n "running script" > /proc/$PPID/fd/1 

示例@chepner:

$ cat subshell.sh 
#!/bin/bash 
write() { echo noppid 
echo echowithppid > /proc/$PPID/fd/1 
} 
write >/dev/null 2>&1 
$ ./subshell.sh 
echowithppid 
$ 
+1

'fd/1'是標準輸出,可能是也可能不是終端。 – chepner

+0

^^嘗試'bash -c'./subshel​​l.sh; true'>/dev/null' – anishsane

+0

謝謝。它也可以工作。但是,正如我問上面的用戶,它強制發送到終端?或者將它發送到終端和日誌文件(如果是這種情況)? –