CentOS 上 Bash 脚本中导出的使用

ala*_*lan 1 bash centos environment-variables export amazon-web-services

我对 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
Run Code Online (Sandbox Code Playgroud)

我添加了 echo 语句,以便我可以看到发生了什么。我运行时的输出

sh myscript.sh
Run Code Online (Sandbox Code Playgroud)

是:

/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
Run Code Online (Sandbox Code Playgroud)

因此,当我引用在同一脚本中设置的其他环境变量时,导出命令似乎不起作用。

我哪里错了?

谢谢

更新:我已经尝试了下面的建议,但仍然不高兴。运行 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
Run Code Online (Sandbox Code Playgroud)

结果是:

+ 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
Run Code Online (Sandbox Code Playgroud)

我在 EC2 上使用默认的 Amazon Linux AMI,所以我的设置不应该有任何时髦

cjc*_*cjc 6

您正在通过运行“sh myscript.sh”来执行脚本。如果您使用“sh”调用 bash,bash 将尝试“尽可能模仿 sh 历史版本的启动行为,同时也符合 POSIX 标准”(根据 bash 的手册页,在调用部分)。

历史悠久的 Bourne shell 无法识别“export VARIABLE=value”。Bourne shell 中导出变量的典型方式是“VARIABLE=value ; export VARIABLE”,即值的设置和导出是分开的命令。将这一切作为一个命令来执行是一种 bash 主义。

因此,您可以尝试将您的脚本调用为“bash myscript.sh”,这应该可以工作(它对我有用,但不可否认它也适用于“sh myscript.sh”调用;我的 shell 设置在某处可能有些有趣,或者你的一些有趣的东西)。您还可以使用“chmod +x myscript.sh”使文件可执行,然后直接使用“./myscript.sh”运行它,因为它应该根据“#!”调用bash 在第一行。