Re: definir temporalment variable per a l'ordre actual
__ 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
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
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, 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, 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
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
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, 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
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
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