簡體   English   中英

在工作腳本中將stdout重定向到/ dev / null的grep是什么意思?

[英]What is the meaning of grep with stdout redirection to /dev/null in job script?

我有一個bash腳本,是作為bash作業提交的。 它創建一些文件,執行一些計算,將輸出文件移到其他地方並清理。 為了移動輸出文件,它包含以下幾行:

set -e
mv $tmp/stdout.txt $current/tmp.stdout.txt
grep Report $current/tmp.stdout.txt >/dev/null 2>&1
mv $current/tmp.stdout.txt $current/stdout.txt
set +e

如果計算成功,則輸出文件stdout.txt包含以Report開頭的幾行; 但是沒有的話就沒有。 進一步的處理將檢查$current/stdout.txt文件是否存在(否則重新提交作業)。

第一個mv以臨時名稱將輸出文件從臨時目錄移動到最終目錄。 第二個mv將輸出文件重命名為其最終名稱。 但是,兩者之間的grep的目的是什么? 如果輸出文件包含帶有Report行,它們將被重定向到\\dev\\null ,則什么也沒有發生。 如果輸出文件中沒有包含Report行,則它不會輸出任何內容,既不會輸出到重定向的stdout也不會輸出到重定向的stderr 因此,我的印象是該行不執行任何操作,我應將mv + grep + mv替換為一個mv 我在這里忽略了哪些功能?

set -e在這里很重要。

  • grep將其退出狀態設置為0,表示已成功處理輸入文件並找到了任何結果,否則返回非零值。
  • set -e告訴外殼程序退出,如果任何已檢查的命令具有非零退出狀態。 (它有很多陷阱和警告,通常不應該使用;請參閱BashFAQ#105 )。

因此,除非該代碼嵌入觸發set -e無效的幾種情況之一的上下文中,否則如果grep不匹配,則腳本將在第二個mv之前終止。


編寫腳本這一部分的更好方法是:

mv "$tmp/stdout.txt" "$current/tmp.stdout.txt" || exit
grep -q Report "$current/tmp.stdout.txt" || exit
mv "$current/tmp.stdout.txt" "$current/stdout.txt" || exit
  • grep -qgrep >/dev/null效率更高,因為它可以在看到匹配項時立即退出,否則grep需要一直讀取到輸入文件的末尾。 2>/dev/null通常是不好的做法,因為它隱藏了您需要調試錯誤行為所需要知道的錯誤;因此在這里將其刪除了)。
  • 引號使帶有空格或glob字符的變量安全,否則就不會出現這種情況。
  • 放置|| exit 由於BashFAQ#105中給出的原因, || exit要致命錯誤的單個命令比依賴set -e可靠得多(如果急着請跳過下面的練習寓言,或者請參閱https:// www。 in-ulm.de/~mascheck/various/set-e/中的列表,其中已知set -e的行為在不同的shell和/或shell發行版中會有所不同)。

如果找不到匹配項,則Grep將返回錯誤代碼。

set -e表示錯誤將停止腳本。

grep上還有其他選項,這意味着它沒有輸出而不是進行所有捕獲。

set -ebash配置為在遇到第一個錯誤時中止。 如果grep失敗(什么也沒找到),則bash將在grep之后終止。

但是,大多數grep版本都知道-q選項,這使它們安靜(抑制所有輸出),因此不再需要重定向。 另外,依賴set -e代碼也不容易維護。 適當的grep ... || exit 1 grep ... || exit 1會更明確。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM