質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.30%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

解決済

3回答

1780閲覧

シェルファイルを実行した時にDBに接続し、直後にpostgresのバージョン情報を出力する方法

concon99con

総合スコア3

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

0クリップ

投稿2021/05/31 14:28

前提・実現したいこと

postgreSQLのbashのスクリプトファイルを作成しようとしています。
シェルファイルを実行した時にDBに接続し、直後にpostgresのバージョン情報を出力する。(この時DBから抜けずに接続したまま)

シェルを実行した際にDBから抜けてしまう動作になるのですが抜けずに接続した状態のままにする方法を教えてください。

発生している問題・エラーメッセージ

シェルを実行した際にDBから抜けてしまう動作になる

該当のソースコード

#!/bin/bash psql -U ユーザ名 -d データベース名 -h ホスト名 << EOF select version(); EOF

試したこと

#!/bin/bash
psql -U ユーザ名 -d データベース名 -h ホスト名 << EOF
select version();
EOF

補足情報(FW/ツールのバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/06/01 21:05

素直に #!/bin/bash psql -U ユーザ名 -d データベース名 -h ホスト名 << EOF select version(); EOF psql -U ユーザ名 -d データベース名 -h ホスト名 で2回認証すればいいと思うのですが。。。(.pgpassなどでパスワード入力回避前提) これでは解決しないのでしょうから、コマンド作ってみました! #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <termios.h> #include <stdlib.h> #include <stdio.h> void onerr() { perror("nop"); exit(1); } void func(int in) { char buff[4096]; size_t len; while ((len = read(in, buff, sizeof(buff))) > 0) { if (write(1, buff, len) <= 0) { onerr(); } } } void setterm() { struct termios info; tcgetattr(0, &info); info.c_lflag &= (unsigned) ~ICANON; info.c_iflag &= (unsigned) ~ICRNL; info.c_lflag |= ISIG; tcsetattr(0, TCSANOW, &info); } int main(int argc, char* argv[]) { //setterm(); for (int i = 1; i < argc; ++i) { int in = open(argv[i], O_RDONLY); if (in == -1) { onerr(); } func(in); close(in); } func(0); return 0; } こんな感じのをgccとかでコンパイルすればOKです。 使い方は… root@95190291e488:/# cat hoge.txt select version(); root@95190291e488:/# sample hoge.txt | psql -U postgres version ------------------------------------------------------------------------------------------------------------------ PostgreSQL 13.1 (Debian 13.1-1.pgdg100+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit (1 row) \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+----------+------------+------------+----------------------- postgres | postgres | UTF8 | en_US.utf8 | en_US.utf8 | template0 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres + | | | | | postgres=CTc/postgres (3 rows) こんな感じ。 見て分かるとおり、プロンプトも何もないし、使い勝手は非常に悪いです。端末の設定かといろいろいじってみたけど、有効な回避策は見つからず、コメントにしてそのまま残しています。 なお、IGNOREEOFはCtrl+Dという端末入力に反応しないだけなので、本物のファイル終端に対しては意味ありません。私の方法でも続けて入力できても対話モードになってるわけではないので、使用には全く耐えないゴミです。2回認証しちゃいましょう。
concon99con

2021/06/02 08:34

承知しました。2回認証で考えます。コメントありがとうございます。
guest

回答3

0

ベストアンサー

IGNOREEOF という変数を指定するといいかんじになりそうです。

https://www.postgresql.jp/document/9.0/html/app-psql.html

ただ、すでに設定されているとしたら的外れになりますが…

投稿2021/06/01 01:20

takasima20

総合スコア7468

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/06/01 01:21

勉強になりました。
concon99con

2021/06/02 08:34

コメントありがとうございます。やってみます。
guest

0

2回認証で考えます。コメントありがとうございます。

投稿2021/08/15 06:11

concon99con

総合スコア3

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

EOFでpsqlコマンドに与える入力が終わってしまうので、終わって当然ではないかと。

何をやりたいのか具体的なところが見えてこなくて、完全に想像でしかないですが、
オートログインみたいなことをしたいんですかね。

「\i ファイル名」ってpsqlメタコマンドを実行するよう、
シェルから与えれば、
ファイルに含まれるSQLを実行して止まったりしないかなぁ。

参考:psql

投稿2021/06/01 01:06

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

concon99con

2021/06/02 08:34

了解です。質問が曖昧で失礼しました。コメントありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問