Re: definir temporalment variable per a l'ordre actual

2019-05-17 Conversa Narcis Garcia
__
I'm using this express-made address because personal addresses aren't
masked enough at this mail public archive. Public archive administrator
should fix this against automated addresses collectors.
El 16/5/19 a les 19:46, Ernest Adrogué ha escrit:
> 2019-05-16, 17:21 (+0200); Josep Lladonosa escriu:
>> El que puc aportar és que si es vol un valor de variable permanent després
>> de sortir de l'embolcall es fa:
>>
>> export foo=1; sh
>> $ echo $foo
>> 1
>> $ exit
>> $ echo $foo
>> 1
> 
> Sí, però en aquest cas el que volia és el contrari: modificar l'entorn
> d'aquella ordre en concret i prou.
> 
> De totes maneres punts extra per utilitzar la paraula embolcall ;)
> 
> Salut
> 

Això és el què arranjaria el teu exemple, encara que sembli absurd:
$ foo=1 echo 1

Perquè una assignació a una variable no seria vigent fins a la següent
instrucció (amb el punt i coma o amb diferent línia).

El programa cridat rep la variable DINS la seva execució:
[fitxer +x programa.sh]
#!/bin/sh
echo $foo
[/fitxer]

Amb això també funcionaria:
$ foo=1 programa.sh

És per això que la tècnica funciona per a obrir un programa en una altra
llengua (aquí l'anglès):
$ LANG=en nano
$ LANG=en lowriter

I la demostració de tot plegat és fer-ho segons el teu exemple:
$ LANG=en nano $LANG
(fixa't en el nom de fitxer que edita nano, amb el valor sense canviar)



Re: definir temporalment variable per a l'ordre actual

2019-05-16 Conversa Alex Muntada
Hola Eloi,

> Lligant-ho amb l'explicació que he fet a l'altre correu i per
> completar-la, aquesta construcció (que com bé s'ha dit és
> equivalent a executar-les en dues línies separades) crea la
> variable *només* a l'entorn del shell actual. Això fa que
> funcioni en el cas de l'echo, perquè la substitució la fa el
> propi shell, però la variable d'entorn no està disponible per
> al procés fill:
> 
> $ foo=1; env | grep ^foo=
> 
> Aquesta combinació no torna res, a menys que es precedeixi
> l'assignació amb 'export'.

Una alternativa per passar als subshells la variable sense haver
de definar-la al shell actual és via env (els detalls al man):

$ env foo=1 ...

Quant a la pregunta original de l'Ernest, aquesta altra manera
alternativa funciona bé perquè el shell actual no interpreta
la cadena que conté l'ordre i les variables:

$ foo=1 bash -c 'echo $foo'

Salut!
Alex

--
  ⢀⣴⠾⠻⢶⣦⠀
  ⣾⠁⢠⠒⠀⣿⡁  Alex Muntada 
  ⢿⡄⠘⠷⠚⠋   Debian Developer - log.alexm.org
  ⠈⠳⣄



signature.asc
Description: PGP signature


Re: definir temporalment variable per a l'ordre actual

2019-05-16 Conversa Eloi
El 16/5/19 a les 17:10, Ernest Adrogué ha escrit:
> Amb punt i coma és com fer-ho en línies separades, no es destrueix
> l'assignació:
>
> $ echo $foo
>
> $ foo=1 ; echo $foo
> 1
> $ echo $foo
> 1
> $

Lligant-ho amb l'explicació que he fet a l'altre correu i per
completar-la, aquesta construcció (que com bé s'ha dit és equivalent a
executar-les en dues línies separades) crea la variable *només* a
l'entorn del shell actual. Això fa que funcioni en el cas de l'echo,
perquè la substitució la fa el propi shell, però la variable d'entorn no
està disponible per al procés fill:

$ foo=1; env | grep ^foo=

Aquesta combinació no torna res, a menys que es precedeixi l'assignació
amb 'export'.




Re: definir temporalment variable per a l'ordre actual

2019-05-16 Conversa Ernest Adrogué
2019-05-16, 17:21 (+0200); Josep Lladonosa escriu:
> El que puc aportar és que si es vol un valor de variable permanent després
> de sortir de l'embolcall es fa:
> 
> export foo=1; sh
> $ echo $foo
> 1
> $ exit
> $ echo $foo
> 1

Sí, però en aquest cas el que volia és el contrari: modificar l'entorn
d'aquella ordre en concret i prou.

De totes maneres punts extra per utilitzar la paraula embolcall ;)

Salut



Re: definir temporalment variable per a l'ordre actual

2019-05-16 Conversa Ernest Adrogué
2019-05-16, 18:11 (+0200); Eloi escriu:
> En aquest cas no funciona perquè la comanda echo no està realment
> accedint a l'entorn sinó que és el propi shell qui fa la substitució
> *abans* d'executar la comanda.

Sí, exacte... amb aquest exemple que havia posat no es pot veure si es
modifica o no l'entorn.

Salut.



Re: definir temporalment variable per a l'ordre actual

2019-05-16 Conversa Eloi
El 16/5/19 a les 16:49, Ernest Adrogué ha escrit:
> Em pensava que si feies una assignació de variable a línia d'ordres
> seguida d'una ordre, aquella assignació només tenia efecte per a l'ordre
> en qüestió.  Per exemple, segons això,
>
> $ foo=1 echo $foo
>
> hauria d'escriure "1".  Però estic veient que no fa l'assignació...
>
> Ha canviat recentment, o és que mai ha funcionat així?
>
> Salut

En aquest cas no funciona perquè la comanda echo no està realment
accedint a l'entorn sinó que és el propi shell qui fa la substitució
*abans* d'executar la comanda. O sigui, primer fa la substitució de la
variable $foo a l'entorn del shell (on no està definida), i després
passa a la comanda echo aquesta variable junt amb la resta de l'entorn
però que acaba ignorant perquè echo es limita a repetir el que rep per
paràmetres.

Una forma de veure-ho en funcionament és aquesta:

$ foo=1 env | grep ^foo=

Aquí igualment definim la variable foo i executem la comanda env, que
*sí* consulta el nou entorn i en retorna totes les variables, entre les
quals la foo que just hem definit.




Re: definir temporalment variable per a l'ordre actual

2019-05-16 Conversa Josep Lladonosa
On Thu, 16 May 2019 at 17:10, Ernest Adrogué  wrote:

> 2019-05-16, 16:59 (+0200); tictacbum escriu:
> > foo=1 ; echo $foo
> >
> > creac que cal el punt i coma perquè avaluï l'assignació
>
> Amb punt i coma és com fer-ho en línies separades, no es destrueix
> l'assignació:
>
> $ echo $foo
>
> $ foo=1 ; echo $foo
> 1
> $ echo $foo
> 1
> $
>
> > si crides un script en comptes de echo si que funciona perquè crea una
> > subshell em sembla.. potser algú sap millor que passa realment
>
> Doncs, sí, tens raó...
>
> $ foo=1 sh
> $ echo $foo
> 1
> $ exit
> $ echo $foo
>
> $
>
> pot ser que crei un entorn per al procés fill, però com que echo no
> s'executa en un altre procés, en aquest cas no fa cap efecte.
>

El que puc aportar és que si es vol un valor de variable permanent després
de sortir de l'embolcall es fa:

export foo=1; sh
$ echo $foo
1
$ exit
$ echo $foo
1





>
> Salut
>
>

-- 
--
Salutacions...Josep
--


Re: definir temporalment variable per a l'ordre actual

2019-05-16 Conversa Ernest Adrogué
2019-05-16, 16:59 (+0200); tictacbum escriu:
> foo=1 ; echo $foo
> 
> creac que cal el punt i coma perquè avaluï l'assignació

Amb punt i coma és com fer-ho en línies separades, no es destrueix
l'assignació:

$ echo $foo

$ foo=1 ; echo $foo
1
$ echo $foo
1
$

> si crides un script en comptes de echo si que funciona perquè crea una
> subshell em sembla.. potser algú sap millor que passa realment

Doncs, sí, tens raó...

$ foo=1 sh
$ echo $foo
1
$ exit
$ echo $foo

$

pot ser que crei un entorn per al procés fill, però com que echo no
s'executa en un altre procés, en aquest cas no fa cap efecte.

Salut



Re: definir temporalment variable per a l'ordre actual

2019-05-16 Conversa tictacbum
foo=1 ; echo $foo

creac que cal el punt i coma perquè avaluï l'assignació, si crides un
script en comptes de echo si que funciona perquè crea una subshell
em sembla.. potser algú sap millor que passa realment

Missatge de Ernest Adrogué  del dia dj., 16 de maig 2019 a
les 16:49:

> Em pensava que si feies una assignació de variable a línia d'ordres
> seguida d'una ordre, aquella assignació només tenia efecte per a l'ordre
> en qüestió.  Per exemple, segons això,
>
> $ foo=1 echo $foo
>
> hauria d'escriure "1".  Però estic veient que no fa l'assignació...
>
> Ha canviat recentment, o és que mai ha funcionat així?
>
> Salut
>
>


definir temporalment variable per a l'ordre actual

2019-05-16 Conversa Ernest Adrogué
Em pensava que si feies una assignació de variable a línia d'ordres
seguida d'una ordre, aquella assignació només tenia efecte per a l'ordre
en qüestió.  Per exemple, segons això,

$ foo=1 echo $foo

hauria d'escriure "1".  Però estic veient que no fa l'assignació...

Ha canviat recentment, o és que mai ha funcionat així?

Salut