2012-06-07 80 views
3

我在確定如何獲取錯誤輸出並將其存儲在ksh中的變量或文件時遇到了一些問題。因此,在我的腳本中,我在while循環內有cp -p source.file destination如何獲取錯誤輸出並將其存儲在變量或文件中

當我得到下面的錯誤

cp: source.file: The file access permissions do not allow the specified action. 

我想抓住它,並將其存儲在一個變量或文件。

感謝

回答

4

你可以在命令的錯誤輸出重定向,像這樣:

cp -p source.file destination 2>> my_log.txt 

這將追加該錯誤消息。 my_log.txt文件。如果你希望變量可以重定向標準錯誤輸出到stdout和命令輸出分配給一個變量

my_error_var=$(cp -p source.file destination 2>&1) 
0

你可以做STDERR重定向這樣做:

command 2> /path/to/file.txt 
1

在ksh的(按照Q),如在bash和其他SH衍生物,可以使用重定向,然後在抓變種(使用$(),如果使用的不是反引號好隱約最新版本),得到所有的CP /只標準錯誤輸出:

output=$(cp -p source.file destination 2>&1) 

CP沒有正常輸出任何東西,雖然這會捕獲stdout和stderr;以這種方式捕捉stderr,也可以使用1>/dev/null。重定向到文件的其他解決方案可以使用cat /各種其他命令來輸出/處理日誌文件。

我之所以不使用輸出到臨時文件建議:

重定向到那麼文件讀取,在(通過讀取指令或通過$(cat file)更多低效率),特別是對於只有一行,效率較低並且更慢;儘管如此,如果您想在顯示錯誤之前每次添加它以進行多個操作,則不會太糟糕。除非總是清除臨時文件,否則不要忘記人們中斷(即Ctrl-C)或終止腳本。

如果腳本一次運行多次(例如,如果文件系統/其他延遲導致大量超限或僅來自多個用戶,則可能通過cron發生),除非臨時文件名是唯一的,否則使用臨時文件也可能成爲問題。

除非特別仔細,否則生成臨時文件也是一種安全風險,尤其是如果文件數據再次被處理或內容可能會被別的東西顯示之前被重寫,以便混淆/釣魚用戶/中斷腳本。不要養成習慣,不要太隨便,通過其他問題先閱讀臨時文件(例如mktemp)/ google。

相關問題