stderr를 stdout으로 리디렉션하지 않을 때 grep이 일치하지 않는 줄을 반환하는 이유는 무엇입니까?

stderr를 stdout으로 리디렉션하지 않을 때 grep이 일치하지 않는 줄을 반환하는 이유는 무엇입니까?

내가 사용하는 스크립트는 실제로 다음 출력을 반환합니다.

(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

다른 출력 라인은표준 오류채널은 기본적으로 터미널에 연결되어 있습니다.

요약하자면: 파이프라인이 연결됩니다.표준 출력하나의 명령부터표준입력다음의. 그만큼표준 오류채널은 실제 데이터 흐름에 영향을 주지 않고 오류 메시지(또는 상태 업데이트)가 터미널에 기록될 수 있도록 터미널에 연결됩니다.

관련 정보