リモートサーバー(Cent OS 7)でコマンドを実行し、そのサーバーで定義されている環境変数を使用したいと思います。ただし、このコマンドを実行すると
ssh [email protected] "PGPASSWORD=$DB_PASS psql -U $DB_USER -d $DB_NAME -c 'COPY myapp_currencyprice to STDOUT WITH (DELIMITER \",\", FORMAT CSV, HEADER)' > /tmp/prices.csv"
コマンドが「remotehost.com」ではなく、localhostの「$ DB_PASS」やその他の環境変数を使用したいようです。リモートサーバーで環境変数を参照する正しい方法は何ですか?
答え1
ローカルシェルが文字列を取得しないようにするには、単一引用符を使用する必要があります。
ssh [email protected] 'stuff here...'
その後、内部引用符を置き換える必要があります。
ssh [email protected] 'PGPASSWORD=$DB_PASS psql -U $DB_USER -d $DB_NAME -c "COPY myapp_currencyprice to STDOUT WITH (DELIMITER \",\", FORMAT CSV, HEADER)" > /tmp/prices.csv'
.bash_profile
ただし、対話型シェルを使用していないため含まれていないため、まだ機能しません。この時点で最も明白な解決策は、これを明示的に含めることです。
ssh [email protected] '. .bash_profile; PGPASSWORD=$DB_PASS psql -U $DB_USER -d $DB_NAME -c "COPY myapp_currencyprice to STDOUT WITH (DELIMITER \",\", FORMAT CSV, HEADER)" > /tmp/prices.csv'
さまざまな種類の引用符の違いを理解するには、これら2つの参考文献を見つけてください。
答え2
(コメントはterdonによって提案された答えに変換されました...)
ローカル拡張を防ぐには、$記号をエスケープしてみてください。良い
"PGPASSWORD=\$DB_PASS psql -U \$DB_USER -d $DB_NAME ..."
あなたのコメントで述べたように、正確に機能しないものは何ですか?また、コマンドを一重引用符で囲みましたか?どちらかを選択してください。