我使用的腳本實際上會傳回以下輸出:
(source /Thetra/Commun/env_ora.sh >/dev/null; sh aclenv/arun)
geIlgif0t1 -DVORACLE
geIlgif0t1
prg_25900:
ACOMP=X
geAhadlAd1 -DVORACLE
geAhadlAd1
prg_25948:
ACOMP=A
syCcgge0t1 -DVORACLE
syCcgge0t1
prg_26023:
ACOMP=S2
syVcalq0t1 -DVORACLE
syVcalq0t1
prg_26071:
ACOMP=Y
syVvali0t1 -DVORACLE
syVvali0t1
prg_26119:
ACOMP=Y
syAedit0t1 -DVORACLE
syAedit0t1
prg_26167:
(1312) DBMS WARNING: Column not found in table. (-11238)
RETURN (-6)
END
END
END
IF cm_para_f2('VDEF','abQtip_0n1','unicite',syAedit0t1:$v_unicite)<>0
OR null_convert$(syAedit0t1:$v_unicite,'R') <> 'F' THEN SET syAedit0t1:$v_unicite TO 'R'
SET $v_tips_mrgl TO 'S'
SET $v_rfbt_iban, $v_rfbt_intitule, $v_orga_creancier, $v_orga_tip_adr1, $v_orga_tip_adr2,
$v_orga_tip_adr3, $v_code_docu, $v_tips_centre, $v_code_etab, $v_orga_tip_emetteur,
$v_orga_emetteur, $v_rfbt_compte, $v_orga_banque, $v_rfbt_emetteur TO
SELECT rfbt_iban, rfbt_intitule, orga_creancier, orga_tip_adr1, orga_tip_adr2, orga_tip_adr3
ACOMP=N
syAvali0t1 -DVORACLE
syAvali0t1
prg_26215:
(2751) DBMS WARNING: Column not found in table. (-11238)
+ to_string_using$(str_to_val$(substr$(clip_str$(to_string$($f_imme_no)),1,4)),'&&&&')
+ to_string_using$(str_to_val$(substr$(clip_str$(to_string$($f_sepa_propriete_no)),1,5)),'&&&&&')
IF syAvali0t1:$v_unicite ='R' THEN
SET $v_sepa_rum3 TO $v_sepa_rum3 + substr$(to_string_using$(syAvali0t1:$v_ordr_direct,'&&&&&&&&&'),7,9)
ELSE
ACOMP=N
syAcalc0t1 -DVORACLE
syAcalc0t1
prg_26263:
ACOMP=N
syAcalc0t2 -DVORACLE
syAcalc0t2
prg_26311:
ACOMP=N
syAcalc0t3 -DVORACLE
syAcalc0t3
prg_26359:
ACOMP=N
為了檢查錯誤,我使用以下命令:
(source env_ora.sh >/dev/null; sh aclenv/arun) | egrep '^ACOMP=$'
輸出:
(1312) DBMS WARNING: Column not found in table. (-11238)
RETURN (-6)
END
END
END
IF cm_para_f2('VDEF','abQtip_0n1','unicite',syAedit0t1:$v_unicite)<>0
OR null_convert$(syAedit0t1:$v_unicite,'R') <> 'F' THEN SET syAedit0t1:$v_unicite TO 'R'
SET $v_tips_mrgl TO 'S'
SET $v_rfbt_iban, $v_rfbt_intitule, $v_orga_creancier, $v_orga_tip_adr1, $v_orga_tip_adr2,
$v_orga_tip_adr3, $v_code_docu, $v_tips_centre, $v_code_etab, $v_orga_tip_emetteur,
$v_orga_emetteur, $v_rfbt_compte, $v_orga_banque, $v_rfbt_emetteur TO
SELECT rfbt_iban, rfbt_intitule, orga_creancier, orga_tip_adr1, orga_tip_adr2, orga_tip_adr3
(2751) DBMS WARNING: Column not found in table. (-11238)
+ to_string_using$(str_to_val$(substr$(clip_str$(to_string$($f_imme_no)),1,4)),'&&&&')
+ to_string_using$(str_to_val$(substr$(clip_str$(to_string$($f_sepa_propriete_no)),1,5)),'&&&&&')
IF syAvali0t1:$v_unicite ='R' THEN
SET $v_sepa_rum3 TO $v_sepa_rum3 + substr$(to_string_using$(syAvali0t1:$v_ordr_direct,'&&&&&&&&&'),7,9)
ELSE
我們可以看到 grep 傳回不符合的行。
當我使用以下命令將 stderr 重定向到 stdout 時:
(source /Thetra/Commun/env_ora.sh >/dev/null; sh /Thetra/Oracle/transfert/P2016.H.1/aclenv/arun) 2>&1 | egrep '^ACOMP=$'
正如預期的那樣,輸出為空。
當 stderr 未重定向時,為什麼 grep 會傳回不符合的行?
答案1
如果運行此命令,您將獲得兩個文件,一個名為stdout
,一個名為stderr
,其中包含輸出標準輸出和輸出到標準錯誤, 分別:
(source env_ora.sh >/dev/null; sh aclenv/arun) >stdout 2>stderr
您的grep
命令只能看到發送到的數據標準輸出。它甚至看不到這裡寫入的數據標準錯誤。
在後續評論中採用您的範例的變體,您只會看到標準輸出透過管道進行處理sed
:
( echo "stdout"; echo "stderr" >&2 ) | sed 's/std/STD/'
stderr
STDout
另一行輸出直接寫入標準錯誤頻道,預設連接到您的終端。
總而言之:管道連接標準輸出從一個命令到標準輸入下一個。這標準錯誤通道連接到您的終端,以便可以在其中寫入錯誤訊息(或狀態更新),而不會影響實際資料流。