私は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を使用しているので、設定にファンキーなものはないはずです
「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」を使用して直接実行することもできます。最初の行に。
スクリプトの各行の終わりに誤ったキャリッジリターンがあるようです。これは、その存続期間のある時点で、スクリプトがWindowsシステムで編集された場合に発生する可能性があります。次のコマンドを使用して修復を試みることができます。
Perl -pi -e 's/\r//' myscript.sh
キャリッジリターンが誤っているため、意図したようにディレクトリrds
を参照していませんが、代わりにrds
の後にキャリッジリターンが続きます。おそらくその名前のディレクトリはなく、rds-delete-db-instance
がrds
ディレクトリ内にあると仮定すると、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
コマンドを使用すると、スクリプトが深夜直前に開始された場合に備えて、より短く、より堅牢になります。
えーと、=の右側のビットを二重引用符で囲んでみてください。ここでの私の小さなテストでは、テストの有無にかかわらず機能しました。CentOSにはありませんが、bashはさまざまなLinuxで同じように動作するはずです。 。
入力すると
sh myscript.sh
新しい環境変数のセットを使用して新しいシェルを生成します。そのシェル内では、変数$ AWS_RDS_HOMEに値 "/ opt/aws/apitools/rds"が含まれますが、shが終了するとそのコンテキストは消えます。
使いたいようですね
。 myscript.sh
これは、「ドット」、「スペース」、ファイル名の順です。 「dot」コマンドは、現在のシェルのコンテキストで引数ファイルを解釈するため、エクスポートされた変数は、その後、現在のシェルで使用できます。