2016-06-29 58 views
1

我正在通過一個主父腳本運行一堆腳本。我在下面的父級腳本中添加了日誌記錄代碼:限制特定子shell腳本的日誌記錄

exec 3>&1 4>&2 
trap 'exec 2>&4 1>&3' 0 1 2 3 
exec 1>logFileName 2>&1 

這會生成所有子腳本的日誌。我想跳過一個特定腳本的日誌生成,因爲它的日誌有時會非常繁重。

有沒有辦法做到這一點?非常感謝!

我父腳本是這樣的:

mkdir -p $scriptFolder/log 
logFile="$scriptFolder/log/$(echo "$4" | tr -d '\n\r')_log_ImportMain_$dateTime.log" 
exec 3>&1 4>&2 
trap 'exec 2>&4 1>&3' 0 1 2 3 
exec 1>$logFile 2>&1 
source $scriptFolder/shellscripts/1.copyFilesFromFTP.sh 
source $scriptFolder/shellscripts/2.import.sh 
source $scriptFolder/shellscripts/3.export.sh 
source $scriptFolder/shellscripts/4.copyFilesToFTP.sh 

我想跳過日誌記錄3.export.sh,是否有任何可能的方式做到這一點?

+1

你顯示的代碼並不告訴我們你是如何運行這些腳本或如何生成他們的日誌。如果這是一個編排腳本,它將所有其他腳本作爲子流程單獨運行,請從不希望輸出的標準錯誤(和/或標準輸出)中丟棄。 – tripleee

+1

你列舉的'trap'信號真的很奇怪。你想在這裏完成什麼? – tripleee

+0

我有一個簡單地調用所有子腳本的父腳本。以上代碼正在用於生成日誌。在調用子腳本之前,我在父腳本中有這個日誌代碼。我只想排除子腳本的日誌生成,因爲它的日誌很重,我只需要一個日誌文件來處理整個過程。 –

回答

1

您沒有運行腳本作爲子,你的問題與「父」一詞所暗示的,但無論如何,你可以有另一個重定向爲該單個命令,像這樣:

mkdir -p "$scriptFolder"log  # notice quoting 
logFile="$scriptFolder/log/$(echo "$4" | tr -d '\n\r')_log_ImportMain_$dateTime.log" 
exec 3>&1 4>&2 
trap 'exec 2>&4 1>&3' 0 1 2 3 15 # notice addition of 15 
exec 1>"$logFile" 2>&1   # notice quoting here, too 
source $scriptFolder/shellscripts/1.copyFilesFromFTP.sh 
source $scriptFolder/shellscripts/2.import.sh 
# Temporarily disable logging for this source statement 
source $scriptFolder/shellscripts/3.export.sh >/dev/null 2>&1 
source $scriptFolder/shellscripts/4.copyFilesToFTP.sh 

>/dev/null 2>&1是在第三個source語句的持續時間內有效,並且文件描述符在完成時恢復到它們先前的狀態。

順便說一句,你真的確定"$4"可以包含嵌入換行符,並且你想在這種情況下刪除它們嗎?從echo後面的換行符將被刪除,所以也許你只是想logfile="$scriptfolder/log/${4}_log_ImportMain_$dateTime.log"

+0

謝謝三合一。 關於「$ 4」,是的,它可以包含換行符。 –

+0

如果您的腳本是Bash腳本,那麼執行類似'logFile =「$ scriptfolder/log/$ {4 // $'[\ r \ n]'/} _ log_ImportMain_ $ dateTime.log」' – tripleee

+0

「更經濟,我也會嘗試。我仍然是shell腳本的新手:) –