関数呼び出しで、別名の末尾にheredoc(<<)を追加します。

関数呼び出しで、別名の末尾にheredoc(<<)を追加します。

データベースへのpsql接続文字列であるエイリアスがあります。エイリアスが次のようになるとしましょう。

alias GQQ='psql "host=$host user=$redshift_uname dbname=$redshift_dbname port=$port pass word=$redshift_pwd"'

このエイリアスはデータベースに接続できるように存在しますが、データベースに単純なクエリを送信する関数からそれを呼び出したいと思います。

通常の端末で First: GQQ <<EOFSecond:<QUERY> ex. SELECT * FROM table LIMIT 10;と Third: を実行でき、EOFクエリ結果が返されます。

次のように、この機能をシミュレートする関数を作成したいと思います。

function qredshift() {

    GQQ <<EOF
    $*
    EOF

}

しかし、これを定式化する方法がわかりません。シェルで試して、別の場所に引用符を追加しました。これを実行する正しい方法は何ですか?

答え1

EOF区切り文字と見なされるには、行の内容全体が必要です。

qredshift() {
   local IFS=' '
   psql "host=$host user=$redshift_uname dbname=$redshift_dbname port=$port password=$redshift_pwd" <<EOF
$*
EOF
}

このドキュメントで$ *が見つかると、位置引数は$IFSシェルに従って最初の文字またはスペースに関連付けられます。したがって、IFSシェル間の動作が一貫するようにスペースを設定しました。また、明示的な接続スペースをzsh使用することもできます${(j[ ])@}

ここにあるドキュメントに加えて、次のものを使用できます。

printf '%s\n' "$*" | psql...

または:

printf '%s\n' "$@" | psql...

各引数をqreshift別々の入力行に渡しますpsql

または、zshスタイルのhere-stringを使用してください(現在のbashや他のシェルでサポートされています)。

psql... <<< "$*"

psql(これはpostgresqlクライアントであると仮定します)SQLクエリを使用して実行することもできます-c

psql -c "$*" ...

パラメーターが指定されていない場合、パラメーターqredshiftまたは stdin から SQL コードを取得するには、次のようにします。

qredshift() {
   local IFS=' '
   psql ${1+"-c$*"} "host=$host user=$redshift_uname dbname=$redshift_dbname port=$port password=$redshift_pwd"
}

これにより、次のことができます。

qredshift 'select * from...'
qredshift <<< 'select * from...'
qredshift << 'EOF'
select * from...
EOF

パスワードはシステム内の公開情報なので、コマンドラインからパスワードを渡すことはお勧めできません。

環境変数はプライベートなので、パラメータの代わりに環境変数を介してパスワードを渡す方がPGPASSWORD="$redshift_pwd" psql ...安全です。

関連情報