• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:(Linux、データベース初心者)スクリプトを実行するとPermiss)

スクリプトを実行するとPermission deniedが発生する

このQ&Aのポイント
  • UbuntuサーバにインストールしたPostgresqlに対し、スクリプトを実行してcsvファイルをインポートしようと考えています。その際にPermission deniedが発生しテーブルにデータが入りません。
  • スクリプトファイルとエラーメッセージがあります。スクリプトファイルには接続文字列とインポート処理が記述されており、エラーメッセージにはPermission deniedが表示されています。
  • ファイルの権限等は確認しましたが、具体的な原因がわかりません。どうか、ご指摘いただければ助かります。

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

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 '\'','\' とかします。 #等幅フォントで見ないとわかりずらいものになってしまいました。

ZCL
質問者

お礼

間違いの指摘だけでなく、 私が誤解していた部分まで教えていただきありがとうございました。 大変判りやすく、すごく助かりました。 もっと作法を勉強しなくては…

関連するQ&A