データベースへのpsql接続文字列であるエイリアスがあります。エイリアスが次のようになるとしましょう。
alias GQQ='psql "host=$host user=$redshift_uname dbname=$redshift_dbname port=$port pass word=$redshift_pwd"'
このエイリアスはデータベースに接続できるように存在しますが、データベースに単純なクエリを送信する関数からそれを呼び出したいと思います。
通常の端末で First: GQQ <<EOF
Second:<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 ...
安全です。