제가 작업 중인 셸 스크립트에는 데이터베이스에서 여러 열과 행을 가져오는 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 프로세스에서 이 모든 작업을 수행할 수 있습니다(다른 언어도 가능함).