공정 배관의 대안

공정 배관의 대안

제가 작업 중인 셸 스크립트에는 데이터베이스에서 여러 열과 행을 가져오는 SQL 쿼리가 있습니다.

get_names() {
    $ORACLE_HOME/bin/sqlplus -s usr/pwd <<EOF
        SELECT id,name,age FROM table;
        Exit;
EOF
}

그런 다음 이 결과를 읽기 위해 함수의 출력을 파이프합니다.

get_names | while read sid p_name p_age ; do ... done.

이제 |서브쉘이 생성되고 있으므로 이를 피해야 합니다. 이 문제에 대한 다른 대안이 있습니까?

우리는 하위 프로세스를 피하기 위해 이 파이프 문을 삭제하려고 합니다.

답변1

프로세스 대체를 지원하는 셸(예: bash, ksh 또는 zsh)을 사용하는 경우 프로세스 대체를 사용할 수 있습니다.

while read sid p_name p_age ; do ...; done <  <(get_names)

파이프의 최종 링크가 실행 중인 셸이 되도록 하려면(실행 중인 셸에 영향을 미칠 수 있도록) bash에서 이 작업이 필요합니다.

for sh in bash ksh zsh; do 
     echo $sh:; $sh -c 'while read var; do i=$var
     done < <(printf "%s\n" 1 2); echo $i '
done

산출:

bash:
2
ksh:
2
zsh:
2

일반 파이프라인의 경우:

for sh in bash ksh zsh; do 
     echo $sh:; $sh -c 'printf "%s\n" 1 2 | 
         while read var; do i=$var; done ; echo $i '; 
done

bash는 현재 셸 대신 하위 셸에서 while 루프를 실행하기 때문에 할당이 수정되지 않았습니다.

bash:

ksh:
2
zsh:
2

답변2

Python 프로세스에서 이 모든 작업을 수행할 수 있습니다(다른 언어도 가능함).

관련 정보