web-dev-qa-db-ja.com

CentOSのBashスクリプトでのエクスポートの使用

私はLinuxに非常に慣れていないので、CentOSの非常に単純なBashスクリプトに問題があります。

#! /bin/bash
# script to restore the cognos rds from snapshot
export AWS_RDS_HOME=/opt/aws/apitools/rds
export PATH=$PATH:$AWS_RDS_HOME/bin
export AWS_CREDENTIAL_FILE=$AWS_RDS_HOME/credential-file-path.template
echo $AWS_RDS_HOME
echo $PATH
echo $AWS_CREDENTIAL_FILE
rds-delete-db-instance mydb --final-db-snapshot-identifier mydb-daily-$(date +%Y)-$(date +%m)-$(date +%d) --force -region eu-west-1

何が起こっているのかを確認できるように、echoステートメントを追加しました。で実行したときの出力

sh myscript.sh

は:

/opt/aws/apitools/rds
/bin/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/aws/bin:/home/ec2-user/bin:/opt/aws/apitools/rds
/credential-file-path.template
rds-delete-db-instance: command not found

そのため、同じスクリプトで設定されている他の環境変数を参照すると、エクスポートコマンドが機能していないように見えます。

どこが間違っているのですか?

ありがとう

更新:私は以下の提案を試しましたが、喜びはありません。 bash-xの実行は興味深いものでした。連結しようとするたびに、以下の「\ r」がこの背後にある可能性がありますか?例えば.

#! /bin/bash
# test script
export AWS_RDS_HOME=/opt/aws/apitools/rds
export PATH=$PATH:$AWS_RDS_HOME/bin
export AWS_CREDENTIAL_FILE=$AWS_RDS_HOME/credential-file-path.template
echo $AWS_RDS_HOME
echo $PATH
echo $AWS_CREDENTIAL_FILE

結果:

+ export $'AWS_RDS_HOME=/opt/aws/apitools/rds\r'
+ AWS_RDS_HOME=$'/opt/aws/apitools/rds\r'
+ export $'PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/aws/bin:/home/ec2-user/bin:/opt/aws/apitools/rds\r/bin\r'
+ PATH=$'/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/aws/bin:/home/ec2-user/bin:/opt/aws/apitools/rds\r/bin\r'
+ export $'AWS_CREDENTIAL_FILE=/opt/aws/apitools/rds\r/credential-file-path.template\r'
+ AWS_CREDENTIAL_FILE=$'/opt/aws/apitools/rds\r/credential-file-path.template\r'
+ echo $'/opt/aws/apitools/rds\r\r'
/opt/aws/apitools/rds
+ echo $'/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/aws/bin:/home/ec2-user/bin:/opt/aws/apitools/rds\r/bin\r\r'
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/aws/bin:/home//binuser/bin:/opt/aws/apitools/rds
+ echo $'/opt/aws/apitools/rds\r/credential-file-path.template\r'
/credential-file-path.template

EC2でデフォルトのAmazonLinux AMIを使用しているので、設定にファンキーなものはないはずです

1
alan

「shmyscript.sh」を実行してスクリプトを実行しています。 「sh」を使用してbashを呼び出すと、bashは「POSIX標準にも準拠しながら、shの履歴バージョンの起動動作を可能な限り模倣する」ことを試みます(bashのmanページによると、呼び出しセクション)。

歴史的なBourneShellは、「exportVARIABLE = value」を認識しません。 Bourne Shellで変数をエクスポートする一般的な方法は、「VARIABLE = value; export VARIABLE」です。つまり、値の設定とエクスポートは別々のコマンドです。すべてを1つのコマンドとして実行することは、bash-ismです。

したがって、スクリプトを「bash myscript.sh」として呼び出すことができます。これは機能するはずです(確かに「shmyscript.sh」の呼び出しでも機能しますが、私にとっては機能します。シェル設定のどこかで何かおかしなことがあるかもしれません。 、またはあなたの面白いもの)。 「chmod + x myscript.sh」を使用してファイルを実行可能にし、「#!」に従ってbashを呼び出す必要があるため、「。/myscript.sh」を使用して直接実行することもできます。最初の行に。

6
cjc

スクリプトの各行の終わりに誤ったキャリッジリターンがあるようです。これは、その存続期間のある時点で、スクリプトがWindowsシステムで編集された場合に発生する可能性があります。次のコマンドを使用して修復を試みることができます。

Perl -pi -e 's/\r//' myscript.sh

キャリッジリターンが誤っているため、意図したようにディレクトリrdsを参照していませんが、代わりにrdsの後にキャリッジリターンが続きます。おそらくその名前のディレクトリはなく、rds-delete-db-instancerdsディレクトリ内にあると仮定すると、command not foundを取得する理由が説明されます。

私がここで修正しようとしたスクリプトには、他にもいくつかの問題があります。

#!/bin/bash
# script to restore the cognos rds from snapshot
export AWS_RDS_HOME=/opt/aws/apitools/rds
export PATH="$PATH:$AWS_RDS_HOME/bin"
export AWS_CREDENTIAL_FILE="$AWS_RDS_HOME/credential-file-path.template"
echo "$AWS_RDS_HOME"
echo "$PATH"
echo "$AWS_CREDENTIAL_FILE"
rds-delete-db-instance mydb --final-db-snapshot-identifier "mydb-daily-$(date +%Y-%m-%d)" --force -region eu-west-1

#!の後のスペースは通常使用されないため削除しましたが、スペースがないとスクリプトの移植性が少し向上すると思います。

"文字が使用されている文字列の前後に$を追加しました。 "を使用して生成された展開にスペースを含む特殊文字が含まれている場合、$は重要です。

さらに、3つのdateコマンドを1つに変更しました。単一のdateコマンドを使用すると、スクリプトが深夜直前に開始された場合に備えて、より短く、より堅牢になります。

1
kasperd

えーと、=の右側のビットを二重引用符で囲んでみてください。ここでの私の小さなテストでは、テストの有無にかかわらず機能しました。CentOSにはありませんが、bashはさまざまなLinuxで同じように動作するはずです。 。

0
Elshar

入力すると

sh myscript.sh

新しい環境変数のセットを使用して新しいシェルを生成します。そのシェル内では、変数$ AWS_RDS_HOMEに値 "/ opt/aws/apitools/rds"が含まれますが、shが終了するとそのコンテキストは消えます。

使いたいようですね

。 myscript.sh

これは、「ドット」、「スペース」、ファイル名の順です。 「dot」コマンドは、現在のシェルのコンテキストで引数ファイルを解釈するため、エクスポートされた変数は、その後、現在のシェルで使用できます。

0
rlduffy