Shell Script – Export

shell_script_export

Voltando a falar de Shell Script, vamos ver esses carinha (export), quem vive no mundo dos terminais Linux e realiza compilação, programação via terminal usa export como o Padre usa a bíblia ( minha comparação heim!).
Seu uso é para exportar variáveis em ambiente Linux, parece simples né? Mas é muito simples, porém nos da um poder muito grande, vamos entender porque.

No primeiro exemplo o uso mais básico, com o script ex1export.sh:

#!/bin/bash

echo $MENU

Testes no terminal com a variável MENU e nosso script ex1export.sh:

cleiton@linuxVM:~/projetos/shell script/export$ echo $MENU

cleiton@linuxVM:~/projetos/shell script/export$ MENU=1
cleiton@linuxVM:~/projetos/shell script/export$ echo $MENU
1

cleiton@linuxVM:~/projetos/shell script/export$ ./ex1export.sh

cleiton@linuxVM:~/projetos/shell script/export$ echo $MENU
1
cleiton@linuxVM:~/projetos/shell script/export$ ./ex1export.sh

cleiton@linuxVM:~/projetos/shell script/export$ export MENU
cleiton@linuxVM:~/projetos/shell script/export$ ./ex1export.sh
1
cleiton@linuxVM:~/projetos/shell script/export$ echo $MENU
1

cleiton@linuxVM:~/projetos/shell script/export$

Analisando a saída acima, podemos ver que na linha 1 eu mandei imprimir na tela o conteúdo da variável $MENU, como não criei ela, não tem nada, na linha 3 atribuo o valor 1 para MENU, agora a variável existe e possui o valor 1. Na sequencia na linha 4 mando imprimir novamente e o valor 1 é exibido, e no script que criamos (ex1export.sh) também mando imprimir $MENU, e é o que faço na linha 7 executo o script e nada é exibido na tela, What!?! Tento novamente nas linhas a seguir e não funciona mesmo.

Quando criamos a variável MENU ela passa a ser referenciada apenas no shell e ponto. Se eu quero utilizar ela para os processos derivados deste shell ae uso o export, tudo que for executado a partir deste shell e procurar por $MENU irá funcionar. É o que faço na linha 13 eu exporto a variável MENU (sim, apenas o nome sem o $) e  em seguida executo o script ex1export.sh novamente e voilá imprimiu como queríamos.

Vamos agora criar dois scripts o ex2export.sh que irá criar a variável ARDUINO com o valor UNO, que irá exportar e chamar o script ex3export.sh, vamos ver no que da a brincadeira:

Codigo ex2export.sh

#!/bin/bash

ARDUINO="UNO"
export ARDUINO

./ex3export.sh

Codigo ex3export.sh

#!/bin/bash

[ ! -z $ARDUINO ] || exit 0

echo "Varivel ARDUINO foi setada com : $ARDUINO"

Se tiver duvida sobre a logica da linha 3 do ex3export.sh já escrevi um post sobre isso, pode ser visto aqui, mas a logica é se a variável ARDUINO é nula encerra o script.
Agora a saída dos testes realizados:

cleiton@linuxVM:~/projetos/shell script/export$ ./ex3export.sh
cleiton@linuxVM:~/projetos/shell script/export$ ./ex3export.sh
cleiton@linuxVM:~/projetos/shell script/export$ ./ex2export.sh
Varivel ARDUINO foi setada com : UNO
cleiton@linuxVM:~/projetos/shell script/export$ ./ex3export.sh
cleiton@linuxVM:~/projetos/shell script/export$

Analisando a saída acima do terminal na linha 1 e 2 tento executar direto o ex3export.sh, como não possui a variável ARDUINO então ele irá encerrar, na linha 3 chamo o ex2export.sh que declara ARDUINO, exporta e chama o ex3export.sh e show, ocorre como prevíamos, mas na linha 5 volto a chamar ex3export.sh mas nada é mostrado na tela, humm como expliquei sobre os processos oriundos do shell atual, então depois que o shell do ex2export.sh encerrou a variável ARDUINO também se foi, já se tivéssemos declarado no shell que chamei o ex2export.sh ae sim funcionaria.

Quer saber as variáveis atual do seu shell? É só usar o comando export -p, vamos ver:

cleiton@linuxVM:~/projetos/shell script/export$ export -p
declare -x DISPLAY="localhost:10.0"
declare -x HOME="/home/cleiton"
declare -x LESSCLOSE="/usr/bin/lesspipe %s %s"
declare -x LESSOPEN="| /usr/bin/lesspipe %s"
declare -x LOGNAME="cleiton"
declare -x 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:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=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:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=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:*.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:*.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:"
declare -x MAIL="/var/mail/cleiton"
declare -x MENU="1"
declare -x OLDPWD="/home/cleiton"
declare -x PATH="/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games"
declare -x PWD="/home/cleiton/projetos/shell script/export"
declare -x SHELL="/bin/bash"
...
declare -x SSH_TTY="/dev/pts/0"
declare -x TERM="xterm"
declare -x USER="cleiton"

Olha nossa variável MENU na linha 9, legal vou criar uma variável ARM vamos ver se aparece:

cleiton@linuxVM:~/projetos/shell script/export$ ARM=v5
cleiton@linuxVM:~/projetos/shell script/export$ export -p
declare -x DISPLAY="localhost:10.0"
declare -x HOME="/home/cleiton"
declare -x LESSCLOSE="/usr/bin/lesspipe %s %s"
declare -x LESSOPEN="| /usr/bin/lesspipe %s"
declare -x LOGNAME="cleiton"
declare -x 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:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=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:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=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:*.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:*.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:"
declare -x MAIL="/var/mail/cleiton"
declare -x MENU="1"
declare -x OLDPWD="/home/cleiton"
declare -x PATH="/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games"
declare -x PWD="/home/cleiton/projetos/shell script/export"
declare -x SHELL="/bin/bash"
declare -x SHLVL="1"
...
declare -x SSH_TTY="/dev/pts/0"
declare -x TERM="xterm"
declare -x USER="cleiton"

Não apareceu correto? Correto. E não apareceu porque eu não exportei, vamos exportar e tentar novamente.

cleiton@linuxVM:~/projetos/shell script/export$ export ARM
cleiton@linuxVM:~/projetos/shell script/export$ export -p
declare -x ARM="v5"
declare -x DISPLAY="localhost:10.0"
declare -x HOME="/home/cleiton"
declare -x LESSCLOSE="/usr/bin/lesspipe %s %s"
declare -x LESSOPEN="| /usr/bin/lesspipe %s"
declare -x LOGNAME="cleiton"
declare -x 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:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=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:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=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:*.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:*.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:"
declare -x MAIL="/var/mail/cleiton"
declare -x MENU="1"
declare -x OLDPWD="/home/cleiton"
declare -x PATH="/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games"
declare -x PWD="/home/cleiton/projetos/shell script/export"
declare -x SHELL="/bin/bash"
declare -x SHLVL="1"
...
declare -x SSH_TTY="/dev/pts/0"
declare -x TERM="xterm"
declare -x USER="cleiton"

Muitas dessas variáveis exportadas são usadas com bastante frequência e você nem imagina, é o caso da DISPLAY para acesso com VNC, SSH para subir aplicação X, HOME, USER, SHELL e diversas outras que abstrai no uso de (…) também escrevi sobre variáveis aqui caso quiser aprofundar, enfim, agora vou mostrar algo que tenho em meu ambiente de projetos.

Como podemos ver nas saídas do meu export tenho um PATH padrão como o da maioria, e vários script que crio para automatizar tarefas e esta organizado da seguinte maneira:

~/projetos/bin-arm/
~/projetos/bin-avr/
~/projetos/bin-qemu/

E dentro de cada bin-* tenho scripts e binários meus ou de terceiros para tarefas especificas pra não ter que usar o caminho absoluto do script/binario eu adiciono no PATH, no caso tenho um script chamado cleanup.sh no arm-bin, vamos ver:

cleiton@linuxVM:~/projetos/shell script/export$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games
cleiton@linuxVM:~/projetos/shell script/export$
cleiton@linuxVM:~/projetos/shell script/export$ clear
clear clear_console
cleiton@linuxVM:~/projetos/shell script/export$

Estou imprimindo o conteúdo do meu PATH (onde ficam meus binários e do Linux é claro) e na linha 4 eu digito clea e (teclo 2x tab) para auto-completar e exibir as opções com esta base no nome, agora vamos adicionar o caminho do bin-arm ao PATH e tentar novamente.

cleiton@linuxVM:~/projetos/shell script/export$ export PATH=$PATH:~/projetos/bin-arm/
cleiton@linuxVM:~/projetos/shell script/export$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games:/home/cleiton/projetos/bin-arm/
cleiton@linuxVM:~/projetos/shell script/export$ clea
cleanup.sh clear clear_console
cleiton@linuxVM:~/projetos/shell script/export$

Eu exporto uma variável PATH com o conteúdo de $PATH e adiciono meu path particular para este caso e olha quem apareceu agora quando digito clea e (teclo 2x tab), deu pra ver o poder deste comando certo e o leque para você criar scripts e agilizar/automatizar suas tarefas ou rotinas.

Em prol da didática eu usei a pratica direto no terminal, mas no caso do PATH e outras modificações é interessante colocar dentro de um script no login para mudar o PATH, assim que encerrar o script o PATH do shell é o padrão e como eu já disse quando exportamos uma variável a mesma com o seu conteúdo fica disponível aos processos derivados do shell atual e não a um shell pai, então abrindo um outro terminal no Linux, estamos isolados das variáveis exportadas, quando deseja que seja exportado algo ao abrir qualquer shell é interessante utilizar o ~/.bashrc, /etc/profile e ~/.profile procure entender a diferença e qual se encaixa melhor para a sua necessidade ;)

Espero que tenham gostado e até a próxima!

Share Button

CC BY-NC-SA 4.0 Shell Script – Export by Cleiton Bueno is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.