SH: Como fazer vars de um script disponível no script principal?

4

Eu tenho dois scripts que precisam ser executados e ambos exigem as mesmas variáveis definidas da mesma maneira. Como resultado, imaginei que dividiria a configuração das variáveis em um script separado. No entanto, parece que não consigo fazer isso funcionar exatamente onde as variáveis estão sendo exibidas no script principal.

Por exemplo, este é o meu script principal:

#!/bin/sh

. ./vars

printenv

Isso é o que eu tenho no script "vars":

#!/bin/sh
MYVAR=MYVAL

echo "EXECUTED!!"

Na saída, vejo com sucesso "EXECUTED !!", mas a variável MYVAR não está definida para nada.

EXECUTED!!
MAIL=/var/mail/testuser
SSH_CLIENT=192.168.110.1 62953 22
USER=testuser
SHLVL=1
HOME=/home/testuser
OLDPWD=/home/testuser/test
SSH_TTY=/dev/pts/0
LOGNAME=testuser
_=./mainScript
TERM=xterm
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
LANG=en_US.UTF-8
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36:
SHELL=/bin/bash
PWD=/home/testuser
SSH_CONNECTION=192.168.110.1 62953 192.168.110.133 22
    
por Doug 04.05.2016 / 01:56

2 respostas

10

O fornecimento de seu script apenas define variáveis do shell , enquanto printenv mostra variáveis de ambiente . Você precisará export das variáveis para printenv para mostrá-las. Você pode ter usado o set , que mostrará as variáveis do shell.

Você poderia ter feito este script:

#!/bin/sh
export MYVAR=MYVAL

echo "EXECUTED!!"

(já que você está usando bash , o export trabalha com uma tarefa como mostrado).

A propósito: quando você envia um arquivo, os shells não prestam atenção na linha de hashbang #!/bin/sh : essa é a província do kernel em qualquer caso, exceto obliquamente. Curiosamente, isso não é mencionado na página de manual. Você pode ver isso fazendo dois arquivos, digamos "foo" e "bar":

#!/bin/bash
echo "outer $0 $SHELL"
. ./bar
printenv |fgrep MYVAR

e

#!/bin/sh
echo "inner $0 $SHELL"
export MYVAR=$MYVAL

para ver que as variáveis do shell (como $0 ) são as mesmas dentro do arquivo originado, e que os recursos do shell não são afetados.

Eu adiciono essa linha de qualquer maneira, para ajudar no realce de sintaxe.

    
por 04.05.2016 / 02:00
10

A variável é disponível no script principal, já que você usou . (o ponto embutido, também conhecido como source em alguns shells). . ./vars executa vars no contexto do script de chamada.

Seu problema é que você está usando printenv para verificar, mas printenv apenas imprime variáveis ambiente , não variáveis shell . As variáveis de ambiente são gerenciadas pelo sistema operacional e vistas pelos processos filhos. As variáveis do shell são um recurso da linguagem de programação do shell e gerenciadas apenas pelo shell.

Todas as variáveis de ambiente se tornam automaticamente variáveis de shell¹, mas as variáveis de shell são apenas variáveis de shell, a menos que explicitamente exportadas , o que também as torna variáveis de ambiente.

Para verificar quais variáveis estão definidas, use o set builtin. Isto irá listar MYVAR .

Para exportar uma variável, use o export builtin. Faça isso se quiser que a variável seja visível por outros programas iniciados a partir do shell.

export MYVAR

¹ A menos que seu nome não corresponda aos requisitos de uma variável shell.

    
por 04.05.2016 / 02:02