質問: (linux、データベース初心者)スクリプトを実行するとpermiss (linux、データベース初心者)スクリプトを実行するとpermission deniedが発生します。 postgresql psqlに関して よろしくお願いします。 ubuntuサーバにインストールしたpostgresqlに対し、スクリプトを実行してcsvファイルをインポートしようと考えています。 その際にpermission deniedが発生しテーブルにデータが入りません。 以下にスクリプトファイルとエラーメッセージを掲載します。 #!/bin/bash #接続文字列 export pghost="ホスト名” export pgport="ポート番号" export pgdatabase="データベース名" export pguser="ユーザー名" export pgpassword="パスワード" psql='copy bat_test from ' '''/test/test.csv''' ' with delimiter ' ''',''' echo "$psql" | psql echo "commit" | psql <以上、test.sh> <エラーメッセージ> test.sh:/test/test.csv:permission denide <以上、エラーメッセージ> インポートしたいファイルの権限等は確認しましたがわかりませんでした。 何が悪いのかご指摘いただければ助かります。 どうか、よろしくお願いします。
回答: bash等のb sh系では 変数名=値 コマンド.... とすると、変数に値を(一時的に)設定してコマンドを実行します。 > psql='copy bat_test from ' '''/test/test.csv''' ' with delimiter ' ''',''' この文ですが、環境変数 psql='copy bat_test from ' をセットした状態で '''/test/test.csv''' ' with delimiter ' ''',''' を実行する、という意味になります。 'は 2つずつペアになるので ''が空文字列 '/test/test.csv'が/test/test.csv ''が空文字列 となり、 /test/test.csv がコマンドとして実行されます。 が、実際には実行属性が無いので permission denided になります。 (実行属性があったとしても、test.csvが実行できるとは思いませんが) この行全体をpsql変数に設定したいのなら psql="'copy bat_test from ' '''/test/test.csv''' ' with delimiter ' ''','''" と、全体をダブルクォートでくくるとか psql='copy bat_test from '\ '''/test/test.csv'''\ ' with delimiter '\ ''',''' と、スペースを\でエスケープて、単語の区切りとしての意味を無効にします。 ところで、'''を、 'の中に'を入れる目的で使ってませんか? visualbasic等はそういう書き方をしますが、bashではその意味では使えません。 'のなかに'は書けないので、全体をダブルクォートでくくる psql="copy bat_test from '/test/test.csv' with delimiter ','" とか、シングルクォートの前でいったんシングルクォートを閉じて、"'"か\'でシングルクォートを単独で使い、再びシングルクォートを始める psql='copy bat_test from '\''/test/test.csv'\'' with delimiter '\'','\' とかします。 #等幅フォントで見ないとわかりずらいものになってしまいました。