プロセス配管の代替

プロセス配管の代替

私が作業しているシェルスクリプトには、データベースから複数の列と行を取得する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プロセスでこれを行うことができます(他の言語も利用可能です)。

関連情報