https://manuais.iessanclemente.net/index.php?title=Chamadas_a_scripts._Exportar_variables&feed=atom&action=historyChamadas a scripts. Exportar variables - Historial de revisiones2024-03-28T17:47:12ZHistorial de revisiones de esta página en el wikiMediaWiki 1.36.2https://manuais.iessanclemente.net/index.php?title=Chamadas_a_scripts._Exportar_variables&diff=62577&oldid=prevCarrion: /* Experimentaación con source ou "." */2017-10-06T18:41:42Z<p><span dir="auto"><span class="autocomment">Experimentaación con source ou "."</span></span></p>
<p><b>Página nueva</b></p><div>==Introdución==<br />
*Antes de comezar cos scripts que creen o esqueleto das carpetas do noso dominio, imos explicar brevemente como funciona a execución de scripts en Linux e a chamada entre eles:<br />
**Calquera proceso en Linux ten asignado un número de proceso.<br />
**Cada proceso en Linux non comparte nada con outros procesos e ten as súas propias variables.<br />
**As variables poden pasarse de procesos pai a procesos fillos con '''export'''<br />
**Cando se chama a un script, dependendo como se chame pódese crear un novo proceso fillo ou non.<br />
**A consola é un proceso, que ten as súas variables e o seu número de proceso correspondente.<br />
**'''sh script.sh''': sh é un intérprete de comandos que abre un novo proceso fillo para executar o script.<br />
**'''source script.sh''': ''source'' indica que se colla o contido do ficheiro ''script.sh'' e o execute como se as liñas se teclearan dende o proceso que chama ao script. Non se crea un proceso fillo, seguimos no mesmo proceso pai, só que o contido de ''script.sh'' foi traído ao proceso no que estamos.<br />
**'''. script.sh''': é o mesmo que ''source script.sh''<br />
**'''PATH''': variable de contorna que indica os directorios nos que buscar executables.<br />
**Cando se inicia unha terminal ábrese un proceso que ten un id. este pódese consultar con '''echo $$'''<br />
<br />
<br />
*Imos agora con varios exemplos de todo o anterior:<br />
<br />
Abrimos un terminal e imos crear en ''/root/scripts'' que vai conter os scripts<br />
#Comezamos creando un directorio en dserver00 no que ter organizados tódolos scripts.<br />
'''mkdir scripts<br />
'''cd scripts<br />
<br />
==Os procesos e o contorno de traballo onde se executa un script==<br />
<br />
'''SCRIPT: pai.sh<br />
<syntaxhighlight lang="bash" line enclose="div" highlight="4"><br />
#!/bin/bash<br />
<br />
echo Son o script pai<br />
echo Teño o proceso número: $$<br />
<br />
CIDADE=Santiago<br />
<br />
echo Como pai defino a variable Cidade, con valor $CIDADE<br />
</syntaxhighlight><br />
<br />
<br />
<br />
*'''Probas iniciais:<br />
#Comprobamos que numero de proceso ten o terminal no que imos lanzar os scripts.<br />
'''root@dserver00:~/scripts# echo $$<br />
3000<br />
<br />
#Comprobamos en que ruta estamos.<br />
'''root@dserver00:~/scripts# pwd <br />
/root/scripts<br />
<br />
#Comprobamos que o ficheiro pai.sh existe e non ten permisos de execución<br />
'''root@dserver00:~/scripts# ls pai.sh -l<br />
-rw-r--r-- 1 root root 233 Mai 10 13:39 pai.sh<br />
<br />
<br />
<br />
===Chamar a un script co inteprete sh===<br />
<br />
'''root@dserver00:~/scripts# sh pai.sh<br />
Son o script pai<br />
Teño o proceso número: 3830<br />
Como pai defino a variable Cidade, con valor Santiago<br />
<br />
#Observar como o número do proceso do terminal é 3000 e o nº de proceso mentres se executaba o script era 3830<br />
#Falamos en pasado porque ese proceso xa non existe unha vez que rematou o script. <br />
<br />
#Miramos no terminal que valor ten a variable CIDADE que está dentro do script e que se acaba de executar<br />
'''root@dserver00:~/scripts# echo $CIDADE<br />
root@dserver00:~/scripts#<br />
<br />
#Non ten valor no proceso da terminal. Non existe esa variable no terminal,<br />
#pois unha vez que finalizou o script matouse o seu proceso asociado e <br />
#as variables que nese proceso se definiran.<br />
<br />
===Executar un script con source ou con "."===<br />
*Cando se chama a un script con source ou "." é como se as liñas dese script se copiaran ao proceso actual, isto é, neste caso, na terminal:<br />
<br />
#Antes de nada volvemos mirar no terminal que valor ten a variable CIDADE que está dentro do script<br />
'''root@dserver00:~/scripts# echo $CIDADE<br />
root@dserver00:~/scripts#<br />
#Polo explicado antes, non existe esa variable. <br />
<br />
#Revisamos de novo o número de proceso do terminal, que era 3000<br />
'''root@dserver00:~/scripts# echo $$<br />
3000<br />
<br />
'''root@dserver00:~/scripts# . pai.sh <br />
Son o script pai<br />
Teño o proceso número: 3000<br />
Como pai defino a variable Cidade, con valor Santiago<br />
<br />
# Observar agora que non se creou un novo proceso para executar o script, pois dentro do proceso 3000<br />
# o que se fixo foi traer o contido do ficheiro e executar liña a liña dese ficheiro dentro do <br />
# proceso 3000 (O terminal)<br />
<br />
# Por tanto, que pasa agora coa variable cidade no terminal? no proceso 3000?<br />
'''root@dserver00:~/scripts# echo $CIDADE <br />
Santiago<br />
<br />
#Pois que agora a variable CIDADE existe no proceso 3000 (a terminal) e ten valor.<br />
<br />
===Executar o script chamándoo directamente polo seu nome. A variable de contorno PATH ===<br />
<br />
#Para iso o script ten que ser executable. Por agora non o é.<br />
'''root@dserver00:~/scripts# ls pai.sh -l<br />
-rw-r--r-- 1 root root 233 Mai 10 13:39 pai.sh<br />
<br />
#Dámoslle permiso de execución ao script. <br />
'''root@dserver00:~/scripts# chmod +x pai.sh<br />
'''root@dserver00:~/scripts# ls pai.sh -l<br />
-rwxr-xr-x 1 root root 233 Mai 10 13:45 pai.sh<br />
<br />
#Chamamos ao script dende dentro do propio directorio que o contén. Pero dinos que non existe.<br />
'''root@dserver00:~/scripts# pai.sh<br />
-bash: pai.sh: command not found<br />
<br />
# Se miramos a variable PATH, vemos onde se buscan os ficheiros executables<br />
# se non se lles indica unha ruta como no caso anterior<br />
# A variable PATH é unha variable do sistema que herdan tódolos procesos fillos, entre eles a consola actual<br />
'''root@dserver00:~/scripts# echo $PATH<br />
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin<br />
<br />
# Antes de indicar como poderíamos modificar esa variable imos ver que pasa se lle poñemos a ruta ao script.<br />
# Ruta absoluta:<br />
<br />
<br />
# Poderíamos engadir á variable PATH<br />
# Ruta absoluta ao script<br />
'''root@dserver00:~/scripts# /root/scripts/pai.sh <br />
Son o script pai<br />
Teño o proceso número: 3852<br />
Como pai defino a variable Cidade, con valor Santiago<br />
<br />
# Ruta relativa: dende o directorio actual no que estamos. <br />
# Lembrar que o directorio no que estamos sempre se denomina . (non confundir co . de source).<br />
'''root@dserver00:~/scripts# ./pai.sh <br />
Son o script pai<br />
Teño o proceso número: 3853<br />
Como pai defino a variable Cidade, con valor Santiago <br />
<br />
# En ámbolos dous casos o script execútase pois puxemos unha ruta para chegar até el.<br />
# Observar como se abriron novos procesos para executar o script en cada chamada.<br />
# No proceso 3000 (a terminal) seguimos tendo a variable CIDADE da execución anterior con source ou .<br />
<br />
<br />
#A variable PATH pódese modificar para a sesión actual do terminal (proceso 3000) como segue<br />
'''PATH=$PATH:./ # Para engadir ao PATH actual o directorio no esteamos en cada momento <br />
# ou <br />
'''PATH=$PATH:/root/scripts # Ruta absoluta a onde se atopa os scripts que desexamos executar.<br />
# Executamos agora o script simplemente chamándoo polo seu nome dende calquera sitio<br />
'''root@dserver00:~/scripts# pai.sh <br />
Son o script pai<br />
Teño o proceso número: 3856<br />
Como pai defino a variable Cidade, con valor Santiago <br />
# Outro novo proceso.<br />
<br />
# Tan pronto se peche o terminal actual PATH volverá ao seu valor orixinal, perderanse os cambios realizados,<br />
# pois eses cambios pertencen ao proceso 3000.<br />
# Se desexamos facer permanentes eses valores podemos:<br />
## Modificar a variable PATH en /etc/profile -> Afectaría a todo o sistema (Tódolos usuarios).<br />
## Engadir PATH=$PATH:<directorios que se desexan> no fichiero .bashrc da carpeta persoal do usuario que <br />
## desexa ter una PATH personalizado e que non afecte ao sistema nin a outros usuarios.<br />
<br />
==Chamadas entre procesos==<br />
<br />
===Chamadas aos scripts dende o terminal===<br />
*Imos chamar a dous scripts. O segundo usa unha variable que define o primeiro, pero imos chamalos de forma independente dende a consola.<br />
<br />
*Imos saír do terminal e volver entrar, para comezar de novo e que ''PATH'' non teñan en conta os cambios anteriores, nin exista a variable ''CIDADE''.<br />
<br />
*Creamos un novo script en ''/root/scripts'' e situámonos nese directorio.<br />
'''SCRIPT: fillo.sh<br />
<syntaxhighlight lang="bash" line enclose="div" highlight="5"><br />
#!/bin/bash<br />
<br />
echo Son o script fillo<br />
echo Teño o proceso número: $$<br />
echo Meu pai define a variable Cidade, con valor $CIDADE<br />
</syntaxhighlight><br />
<br />
<br />
====Experimentación con sh====<br />
# O novo terminal ten o número de proceso 4000<br />
'''root@dserver00:~/scripts# echo $$<br />
4000<br />
<br />
#Chamamos ao proceso pai e execútase dentro dun novo proceso, <br />
#que se destrúe ao rematar o script, e por tanto as variables que se usaran. <br />
'''root@dserver00:~/scripts# sh pai.sh <br />
Son o script pai<br />
Teño o proceso número: 4023<br />
Como pai defino a variable Cidade, con valor Santiago<br />
<br />
# Chamamos ao proceso fillo e execútase dentro dun novo proceso que se destrúe ao saír. <br />
# Non pode coller o valor da variable CIDADE porque esa variable era do proceso anterior (4023) e <br />
# destruíuse cando rematou o script/anterior.<br />
'''root@dserver00:~/scripts# sh fillo.sh <br />
Son o script fillo<br />
Teño o proceso número: 4024<br />
Como pai defino a variable Cidade, con valor<br />
<br />
====Experimentación con source ou "."====<br />
'''root@dserver00:~/scripts# . pai.sh <br />
Son o script pai<br />
Teño o proceso número: 4000<br />
Como pai defino a variable Cidade, con valor Santiago<br />
# Neste caso o contido de pai.sh executouse liña a liña dentro do proceso 4000 (a terminal).<br />
<br />
# Chamamos ao proceso fillo.sh co intérprete sh.<br />
# Pero vemos que se crea un novo proceso (4027) que non sabe cales son as variables<br />
# que hai no proceso 4000. Por iso non sabe o valor da variable CIDADE<br />
'''root@dserver00:~/scripts# sh fillo.sh <br />
Son o script fillo<br />
Teño o proceso número: 4027<br />
Meu pai define a variable Cidade, con valor <br />
<br />
# Chamamos ao proceso fillo.sh dende o terminal con source ou .<br />
# Co cal, estamos executando liña a liña dentro do proceso 4000. <br />
# E como antes fixemos o mesmo con pai.sh, <br />
# agora a variable CIDADE ten senso dentro do proceso 4000 (terminal)<br />
'''root@dserver00:~/scripts# . fillo.sh <br />
Son o script fillo<br />
Teño o proceso número: 4000<br />
Meu pai define a variable Cidade, con valor Santiago.<br />
<br />
==Chamar a un script dende outro script: Export==<br />
*Para non interferir nesta última experimentación que imos facer, volvemos pechar o terminal e volvemos entrar.<br />
*Para que a variable teña CIDADE, definida dentro de ''pai.sh'', teña senso dentro de fillo.sh imos facelo de 2 maneiras:<br />
<br />
===Chamar dende o fillo ao pai===<br />
<br />
*Primeiro imos chamar dende ''fillo.sh'' ao script ''pai.sh'' <br />
<br />
====Chamar de fillo a pai: usando o intérprete sh====<br />
*Modificamos o contido dos script fillo.sh como segue:<br />
<br />
'''SCRIPT: fillo.sh<br />
<syntaxhighlight lang="bash" line enclose="div" highlight="3,4"><br />
#!/bin/bash<br />
<br />
sh pai.sh<br />
echo =======================================<br />
<br />
echo Son o script fillo<br />
echo Teño o proceso número: $$<br />
echo Meu pai define a variable Cidade, con valor $CIDADE<br />
</syntaxhighlight><br />
*A liña 3 tamén podería ser '''./pai.sh''' se pai.sh tivera permisos de execución. Ou '''pai.sh''' se ademais dos permisos estivera o directorio no PATH<br />
<br />
<br />
*Experimentación<br />
# Dende o terminal chamamos a fillo.sh <br />
# Créase un novo proceso para ese script. (4051)<br />
# O script fillo.sh chama a script pai.sh que define a variable CIDADE pero que a destrúe <br />
# tan pronto como remata a súa execución e devolve o control a fillo.sh que non sabe nada desa variable.<br />
# Observar polos números de proceso que se crea antes o fillo cao pai.<br />
'''root@dserver00:~/scripts# sh fillo.sh <br />
Son o script pai<br />
Teño o proceso número: 4050<br />
Como pai defino a variable Cidade, con valor Santiago<br />
Chamando a fillo.sh<br />
=======================================<br />
Son o script fillo<br />
Teño o proceso número: 4051<br />
Meu pai define a variable Cidade<br />
<br />
<br />
<br />
====Chamar de fillo a pai: usando source ou "."====<br />
*Modificamos o contido dos script fillo.sh como segue:<br />
<br />
'''SCRIPT: fillo.sh<br />
<syntaxhighlight lang="bash" line enclose="div" highlight="3,4"><br />
#!/bin/bash<br />
<br />
. ./pai.sh #é o mesmo que source ./pai.sh<br />
echo =======================================<br />
<br />
echo Son o script fillo<br />
echo Teño o proceso número: $$<br />
echo Meu pai define a variable Cidade, con valor $CIDADE<br />
</syntaxhighlight><br />
*A liña 3 tamén podería ser '''. pai.sh''', pero cando se chamase ao script, no cando de '''sh fillo.sh''' deberamos chamalo como '''. fillo.sh''' (ou source fillo.sh). Neste caso o contorno de execución sería o do terminal, executaríase todo co mesmo número de proceso.<br />
<br />
<br />
*Experimentación<br />
# Dende o terminal chamamos a fillo.sh <br />
# Créase un novo proceso para ese script. <br />
# O script fillo.sh executa as liñas de pai.sh como se as tivera el tecleadas no propio script, pois <br />
# pai.sh é chamado con source ou "."<br />
# Observar en que número de proceso se executan os dous scripts.<br />
'''root@dserver00:~/scripts# sh fillo.sh <br />
Son o script pai<br />
Teño o proceso número: 4060<br />
Como pai defino a variable Cidade, con valor Santiago<br />
Chamando a fillo.sh<br />
=======================================<br />
Son o script fillo<br />
Teño o proceso número: 4060<br />
Meu pai define a variable Cidade, con valor Santiago<br />
<br />
===Chamar dende o pai ao fillo: export===<br />
*Veremos tamén dúas formas<br />
*No segundo caso exportaremos unha variable do pai ao fillo.<br />
<br />
====Chamar de pai a fillo: usando o intérprete sh====<br />
*Modificamos o contido dos script '''fillo.sh''' como segue (Eliminamos a liña que chamaba ao script pai.sh):<br />
'''SCRIPT: fillo.sh<br />
<syntaxhighlight lang="bash" line enclose="div" highlight=""><br />
#!/bin/bash<br />
<br />
echo =======================================<br />
echo Son o script fillo<br />
echo Teño o proceso número: $$<br />
echo Meu pai define a variable Cidade, con valor $CIDADE<br />
</syntaxhighlight><br />
<br />
<br />
<br />
*Modificamos o contido do script '''pai.sh''' como segue:<br />
<syntaxhighlight lang="bash" line enclose="div" highlight="10,11"><br />
#!/bin/bash<br />
<br />
echo Son o script pai<br />
echo Teño o proceso número: $$<br />
<br />
CIDADE=Santiago<br />
<br />
echo Como pai defino a variable Cidade, con valor $CIDADE<br />
<br />
echo Chamando a fillo.sh<br />
sh fillo.sh<br />
</syntaxhighlight><br />
<br />
<br />
*Experimentación<br />
# Dende o terminal chamamos a pai.sh <br />
# Créase un novo proceso para ese script. (4070)<br />
# O script pai.sh chama a script fillo.sh e crease un novo proceso (4071), <br />
# Pero a variable CIDADE é so do contorno do pai, non dos fillos. <br />
# Observar polos números de proceso cal se crea antes.<br />
'''root@dserver00:~/scripts# sh pai.sh <br />
Son o script pai<br />
Teño o proceso número: 4070<br />
Como pai defino a variable Cidade, con valor Santiago<br />
Chamando a fillo.sh<br />
=======================================<br />
Son o script fillo<br />
Teño o proceso número: 4071<br />
Meu pai define a variable Cidade<br />
<br />
<br />
<br />
====Chamar de pai a fillo: exportando variables====<br />
*'''Finalmente: <br />
*'''Exportar unha variable do pai aos fillos: "export"<br />
*Modificamos o contido do script '''pai.sh''' como segue:<br />
<syntaxhighlight lang="bash" line enclose="div" highlight="6,7,10,11"><br />
#!/bin/bash<br />
<br />
echo Son o script pai<br />
echo Teño o proceso número: $$<br />
<br />
CIDADE=Santiago<br />
export CIDADE # As 2 liñas poderían quedar nunha soa: export CIDADE=Santiago<br />
<br />
echo Como pai defino a variable Cidade, con valor $CIDADE<br />
<br />
echo Chamando a fillo.sh<br />
sh fillo.sh<br />
</syntaxhighlight><br />
<br />
<br />
<br />
*Experimentación<br />
# Dende o terminal chamamos a pai.sh <br />
# Créase un novo proceso para ese script. (4080)<br />
# O script pai.sh chama a script fillo.sh e crease un novo proceso (4081), <br />
# Pero antes de chamalo exportou a variable CIDADE, co cal esta vai estar dispoñible para<br />
# tódolos scripts que se chamen dende o pai, aínda que os fillos se executen noutro proceso distinto.<br />
# Observar polos números de proceso cal se crea antes, e como o proceso fillo ten acceso á variable CIDADE<br />
'''root@dserver00:~/scripts# sh pai.sh <br />
Son o script pai<br />
Teño o proceso número: 4080<br />
Como pai defino a variable Cidade, con valor Santiago<br />
Chamando a fillo.sh<br />
=======================================<br />
Son o script fillo<br />
Teño o proceso número: 4081<br />
Meu pai define a variable Cidade, con valor Santiago<br />
<br />
<br />
<br />
<br />
-- [[Usuario:antonio| Antonio de Andrés Lema]] e [[Usuario:Carrion| Carlos Carrión Álvarez]]</div>Carrion