Passando Variável de um script para outro

0

Como posso passar uma variável entre os scripts?

Exemplo: tenho dois scripts de teste:

-- test2.sh
#!/bin/bash
echo "this is test2.sh"
echo "varname is $varname"
echo end

-- tes1.sh
#!/bin/bash 
varname="123456"
ssh [email protected] 
"bash" < varname=$varname test2.sh

A ideia é que eu execute test1.sh , que se conecta a um servidor remoto, e executa test2.sh . Mas tudo que estou recebendo é varName is 123456: No such file or directory

    
por IGGt 09.12.2015 / 16:37

3 respostas

2

Você está enfrentando um problema do tipo "ordem de operações", eu acho. O < é processado antes dos comandos serem executados, então você está executando algo semelhante (embora não idêntico a)

varname=$varname test2.sh | ssh [email protected] bash

que executa o test2.sh localmente e envia essa saída para bash no servidor remoto. É por isso que você vê a saída de test2.sh , mas recebe um erro quando tenta executar essa saída como um comando.

Se você está executando um script que é executável, você não precisa do bash , então você pode fazer

ssh [email protected] "varname=$varname ./test2.sh"

assumindo que test2.sh esteja disponível no servidor remoto.

Se você não tiver test2.sh no servidor remoto e ainda quiser executá-lo, poderá fazer assim:

ssh [email protected] varname="$varname" bash < test2.sh

que redirecionará a fonte do script, mas processará a variável no contexto do bash executável

    
por 09.12.2015 / 16:54
3

Por que você não passa isso apenas como um argumento? ou seja,

test2.sh

#!/bin/bash
echo "this is test2.sh"
echo "varName is $1"
echo end

test1.sh

#!/bin/bash 
varName="123456"
scp test2.sh [email protected]:/tmp/
ssh [email protected] "/tmp/test2.sh $varName"
ssh [email protected] "rm -f /tmp/test2.sh"
    
por 09.12.2015 / 16:46
0

Para definir o ambiente de um processo na linha de comando, você precisa ordenar suas definições antes do comando:

varname=$varname bash < $varname test1.sh

Também parece improvável que você realmente queira abrir um arquivo chamado ...

varname=${expansion_of_varname}

embora pareça ser o que você está tentando fazer. Espero que isso cause problemas também. Se você quiser que toda atribuição de variáveis afete o ambiente de todos os filhos do shell, então você pode fazer:

set -a

... primeiro. (embora, mesmo assim, x=; <${x:=file} sh -c 'echo "$x"' ainda não pareça funcionar sem um ponto e vírgula interveniente) .

    
por 09.12.2015 / 18:09