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