[英]Understanding the effect of curly braces with respect to redirections ("> file1 >& file2" vs. "{ > file1; } >& file2")
請考慮以下 bash 腳本:
#!/bin/bash
touch ./temp
set -C
>./temp &>/dev/null # Visible error message output ("./test7: line 7: ./temp: cannot overwrite existing file")
{ >./temp; } &>/dev/null # No error message
有人可以解釋為什么由倒數第二行中的重定向導致的錯誤消息沒有被尾隨&>/dev/null
抑制,而它在最后一行中按預期工作?
我研究了 bash 手冊中有關重定向和復合命令的段落(特別是有關組命令的部分),但無法從中做出解釋。 畢竟,由於花括號中只有一個命令,離開花括號應該不會改變任何東西,不是嗎? 差異是否與 bash 解析行的順序有關?
根據 bash 手冊( man bash
):
重定向按照它們出現的順序進行處理,從左到右。 [...] 請注意,重定向的順序很重要。
對於> temp >& /dev/null
,當 bash 處理> temp
部分時,stderr 仍然指向 tty,因此您可以看到錯誤。 您可以這樣驗證:
[STEP 101] $ set -C
[STEP 102] $ date >> temp
[STEP 103] $
[STEP 104] $ > temp
bash: temp: cannot overwrite existing file
[STEP 105] $ > temp >& /dev/null
bash: temp: cannot overwrite existing file
[STEP 106] $
[STEP 107] $ >& /dev/null > temp
[STEP 108] $ 2> /dev/null > temp
[STEP 109] $
對於{ > temp; } &> /dev/null
{ > temp; } &> /dev/null
, { > temp; }
{ > temp; }
作為復合命令處理,其輸出作為一個整體由&> /dev/null
重定向。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.