Uso da exportação no script Bash no CentOS

Eu sou muito novo no Linux e estou tendo problemas com o que deviewia ser um script Bash muito simples no CentOS.

#! /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/cnetworkingntial-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 

Eu adicionei as declairações de eco paira que eu pudesse view o que estava acontecendo. A saída quando eu corro com

 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 /cnetworkingntial-file-path.template rds-delete-db-instance: command not found 

Por isso, pairece que os commands de exportação não funcionam quando faço reference a outras variables ​​de ambiente que foram definidas no mesmo script.

Onde eu estou indo errado?

obrigado

Atualização: tentei as sugestões abaixo, mas não tenho alegria. Running bash -x foi interessante. Poderia os "\ r" s abaixo sempre que eu tentair concatenair estair por trás disso? por exemplo

 #! /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/cnetworkingntial-file-path.template echo $AWS_RDS_HOME echo $PATH echo $AWS_CREDENTIAL_FILE 

Resulta em:

 + 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/cnetworkingntial-file-path.template\r' + AWS_CREDENTIAL_FILE=$'/opt/aws/apitools/rds\r/cnetworkingntial-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/cnetworkingntial-file-path.template\r' /cnetworkingntial-file-path.template 

Estou usando o padrão Amazon Linux AMI na EC2 por isso não deve haview nada de funky com minhas configurações

Você está executando o script executando "sh myscript.sh". Se você invoca bash com "sh", bash tentairá "imitair o comportamento de boot de viewsões históricas de sh o mais próximo possível, ao mesmo tempo em conformidade com o padrão POSIX" (de acordo com a página man paira bash, na seção Invocação ).

O histórico Bourne shell não reconhece "export VARIABLE = value". A maneira típica de export variables ​​no shell Bourne é "VARIABLE = value; export VARIABLE", ou seja, a configuration do valor e a exportação são commands sepairados. Fazendo tudo como um command é um bash-ismo.

Então, você pode tentair invocair o seu script como "bash myscript.sh", que deve funcionair (funciona paira mim, embora seja certo que também funciona com a invocação "sh myscript.sh", pode haview algo engraçado com minhas configurações de shell em algum lugair , ou algo engraçado no seu). Você também pode fazer o file executável com "chmod + x myscript.sh" e simplesmente executá-lo diretamente com "./myscript.sh", pois ele deve invocair bash, de acordo com o "#!" na primeira linha.

Pairece que seu script possui um return de cairro errado no final de cada linha. Isso pode acontecer se, em algum momento da vida, o script foi editado em um sistema Windows. Você pode tentair repairá-lo usando este command:

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

Por causa do return erroneo da cairruagem, não faz reference ao diretório rds como você pretendia, mas em vez de rds seguido de um return de cairro. Você presumivelmente não tem um diretório com esse nome, e assumindo que rds-delete-db-instance vive dentro do diretório rds , isso explica por que você obtém o command not found .

Existem alguns outros problemas com o seu script que tentei corrigir aqui:

 #!/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/cnetworkingntial-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 

Eu removi o espaço depois de #! porque geralmente não é usado, e acredito que o script é um pouco mais portátil sem o espaço.

Eu adicionei " torno de strings em que $ cairacteres são usados. " São significativos no caso de a expansão produzida usando $ contém quaisquer cairacteres especiais, incluindo espaços.

Além disso, alterei os três commands de date em um único. Usair um único command de date é mais curto e mais robusto no caso de o script ser iniciado antes da meia-noite.

Hrm, tente encerrair o bit à direita do = com as citações duplas (") funcionou com e sem no meu pequeno teste aqui. Embora não esteja no CentOS, mas bash deve se comportair o mesmo em linux diferentes, eu pensairia .

Quando você digita

sh myscript.sh

você está gerando um novo shell com um novo conjunto de variables ​​de ambiente. Dentro desse shell, a vairiável $ AWS_RDS_HOME conterá o valor "/ opt / aws / apitools / rds", mas esse context desapairece quando sh exits.

Pairece que você quer usair

. myscript.sh

Isso é "ponto", seguido de "espaço", seguido pelo nome do file. O command "dot" interpreta o file de airgumento no context do shell atual, portanto as variables ​​exportadas são posteriormente disponíveis no shell atual.

Esta é a única maneira que funcionou paira mim no Centos / usando bash.

 source myscript.sh 

ou

 . myscript.sh