[Risolto] Chiarimento variabili in script /bin/sh

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
Avatar utente
iononsbalgiomai
Rampante Reduce
Rampante Reduce
Messaggi: 7120
Iscrizione: martedì 29 novembre 2011, 15:50

[Risolto] Chiarimento variabili in script /bin/sh

Messaggio da iononsbalgiomai »

Ciao ragazzi, ho trovato questa discussione in cui viene spiegato come modificare uno script (/etc/grub.d/00_header) per modificare un certo comportamento di Grub.

In quel link è spiegato di dichiarare dapprima una variabile in questo modo:

Codice: Seleziona tutto

GRUBENV="(hd0,msdos1)/grubenv"
Poi assegnare il valore di quella variabile a un'altra variabile:

Codice: Seleziona tutto

grubenv="$GRUBENV"
E infine per riferirsi a quella variabile usare questa forma:

Codice: Seleziona tutto

"\${grubenv}"
Non ho capito questa modo di procedere ma ho provato comunque a seguire le istruzioni alla lettera: non funzionava.

Ho quindi provato a fare a modo mio, ovvero dichiarare la variabile una sola volta, così:

Codice: Seleziona tutto

grubenv="(hd0,msdos1)/grubenv"
E poi riferirmi a quella variabile in questa forma:

Codice: Seleziona tutto

"$grubenv"
Così funziona.

Dato che credo che chi ha scritto su stackexchange conosca la materia, probabilmente meglio di me, cosa mi sfugge? Perché dichiarare una variabile e poi assegnarne il valore a un'altra? Soprattutto, che genere di sintassi è "\${grubenv}"?
Ultima modifica di iononsbalgiomai il sabato 12 giugno 2021, 19:18, modificato 1 volta in totale.
Non aprire una discussione se prima non hai cercato una soluzione nel Wiki né fatto una ricerca nel forum ;)
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8165
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: Chiarimento variabili in script /bin/sh

Messaggio da crap0101 »

iononsbalgiomai ha scritto:
martedì 1 giugno 2021, 15:34
Ciao ragazzi, ho trovato questa discussione in cui viene spiegato come modificare uno script (/etc/grub.d/00_header) per modificare un certo comportamento di Grub.

In quel link è spiegato di dichiarare dapprima una variabile in questo modo:

Codice: Seleziona tutto

GRUBENV="(hd0,msdos1)/grubenv"
Poi assegnare il valore di quella variabile a un'altra variabile:

Codice: Seleziona tutto

grubenv="$GRUBENV"
questo non so, bisognerebbe vedere bene il codice. Ipotizzerei per qualche motivo di compatibilità/portabilità, è possibile che in qualche altro file venga usata la versione uppercase.
Soprattutto, che genere di sintassi è "\${grubenv}"?
è per evitare l'espansione della variabile... se vedi il file 00_header è pieno di heredoc, in pratica viene usato come un template da altri tool di grub per generare grub.cfg con il codice appropriato. Usando quella sintassi la variabile verrà quindi espansa nel momento di eseguire il file in cui è stato inserito il codice e non il file da cui è stato preso (quindi non in 00_header ma in grub.cfg).
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
Avatar utente
iononsbalgiomai
Rampante Reduce
Rampante Reduce
Messaggi: 7120
Iscrizione: martedì 29 novembre 2011, 15:50

Re: Chiarimento variabili in script /bin/sh

Messaggio da iononsbalgiomai »

Ok, ok, non avevo calcolato gli heredoc infatti nelle istruzioni su stackexchange la dichiarazione della variabile in minuscolo sta dopo un cat <<EOF. Di conseguenza in tutti i successivi heredoc ci si riferisce ad essa nella forma "\${grubenv}".
Fa eccezione la funzione initrdfail, preceduta da cat <<"EOF", con le virgolette. In questo caso bisogna riferirsi alla variabile nella forma "${grubenv}", senza \.
In sintesi non avevo interpretato correttamente le istruzioni su stackexchange e il particolare della funzione initrdfail non è esplicitato ma lo si nota nell'esempio allegato.

Edit:
Nonostante sembrasse tutto perfetto, Grub andava ancora in errore. Il file grub.cfg sembrava a posto, ma Grub restituiva l'errore:

Codice: Seleziona tutto

invalid file name `'
Dopo vari tentativi sono giunto alla conclusione che dopo l'assegnazione della variabile è necessario un "export", in altre parole:

Codice: Seleziona tutto

grubenv="$GRUBENV"
export grubenv
Non ho capito se è una particolarità del linguaggio di scripting di Grub, che è un simil-bash, però così funziona.
Non aprire una discussione se prima non hai cercato una soluzione nel Wiki né fatto una ricerca nel forum ;)
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4197
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 20.04.2 LTS
Sesso: Maschile
Contatti:

Re: Chiarimento variabili in script /bin/sh

Messaggio da UbuNuovo »

@crap0101: Ciao, non sparire di nuovo. :)

export serve per rendere visibili, ai processi figli, le variabili dichiarate con export; in pratica le imposta come variabili d'ambiente.

Codice: Seleziona tutto

 8-) pio='qualcosa'
 8-) bash
 8-) echo $pio

 8-) export pio='qualcosa'
 8-) bash
 8-) echo "$pio"
qualcosa
 8-) export -p
...
declare -x pio="qualcosa"
 8-) 
guarda

Codice: Seleziona tutto

export --help
Nel caso in cui sia il primo a rispondere ad una richiesta di aiuto...chiunque abbia una soluzione migliore o anche solo diversa dalla mia è incoraggiato ad intervenire liberamente senza inviarmi alcun messaggio privato. In programmazione è basilare sapere che si può ottenere il medesimo risultato utilizzando metodi diversi.
Avatar utente
iononsbalgiomai
Rampante Reduce
Rampante Reduce
Messaggi: 7120
Iscrizione: martedì 29 novembre 2011, 15:50

Re: Chiarimento variabili in script /bin/sh

Messaggio da iononsbalgiomai »

Ok, nello specifico del file grub.cfg, mi pare di capire che il problema siano le funzioni. Dai test che ho fatto funziona così:

Codice: Seleziona tutto

var="pippo"
echo "${var}"   < ------ restituisce "pippo"

function pluto {
  echo "${var}"
}

pluto           < ------ non restituisce nulla

Codice: Seleziona tutto

var="pippo"
echo "${var}"   < ------ restituisce "pippo"

function pluto {
  var="pippo"
  echo "${var}"
}

pluto           < ------ restituisce "pippo"

Codice: Seleziona tutto

var="pippo"
export pippo
echo "${var}"   < ------ restituisce "pippo"

function pluto {
  echo "${var}"
}

pluto           < ------ restituisce "pippo"


P.S.: questo generico chiarimento sull'uso delle variabili è finalizzato alla realizzazione di questa pagina wiki, attualmente in costruzione: iononsbalgiomai/grubenv
Se rilevate qualcosa da correggere nello specifico della guida, ne parliamo qui.
Non aprire una discussione se prima non hai cercato una soluzione nel Wiki né fatto una ricerca nel forum ;)
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4346
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 18.04.4 64bit

Re: Chiarimento variabili in script /bin/sh

Messaggio da vaeVictis »

iononsbalgiomai ha scritto:
venerdì 11 giugno 2021, 11:58
...

Codice: Seleziona tutto

var="pippo"
echo "${var}"   < ------ restituisce "pippo"

function pluto {
  echo "${var}"
}

pluto           < ------ non restituisce nulla
...
Non ho capito:

Codice: Seleziona tutto

vaevictis@vaevictis-N56VV:~$ var="pippo"
vaevictis@vaevictis-N56VV:~$ echo "${var}"
pippo
vaevictis@vaevictis-N56VV:~$ function pluto { echo "${var}"; }
vaevictis@vaevictis-N56VV:~$ pluto
pippo
Nel secondo codice stai facendo in sostanza la stessa cosa, perché la variabile var interna alla funzione pluto si riferisce comunque a quella globale.

Nel terzo caso, l'export non influisce sul comportamento della funzione.
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once, but I fear the man who has practiced one kick 10000 times.»
Avatar utente
iononsbalgiomai
Rampante Reduce
Rampante Reduce
Messaggi: 7120
Iscrizione: martedì 29 novembre 2011, 15:50

Re: Chiarimento variabili in script /bin/sh

Messaggio da iononsbalgiomai »

vaeVictis ha scritto:
venerdì 11 giugno 2021, 19:45
iononsbalgiomai ha scritto:
venerdì 11 giugno 2021, 11:58
...

Codice: Seleziona tutto

var="pippo"
echo "${var}"   < ------ restituisce "pippo"

function pluto {
  echo "${var}"
}

pluto           < ------ non restituisce nulla
...
Non ho capito:

Codice: Seleziona tutto

vaevictis@vaevictis-N56VV:~$ var="pippo"
vaevictis@vaevictis-N56VV:~$ echo "${var}"
pippo
vaevictis@vaevictis-N56VV:~$ function pluto { echo "${var}"; }
vaevictis@vaevictis-N56VV:~$ pluto
pippo
Eh infatti, in bash è così.

Nel file grub.cfg invece la variabile non è visibile nelle funzioni, a meno di non esportarla. Almeno questo è quanto risulta dalle prove che ho fatto.
Non aprire una discussione se prima non hai cercato una soluzione nel Wiki né fatto una ricerca nel forum ;)
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4346
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 18.04.4 64bit

Re: Chiarimento variabili in script /bin/sh

Messaggio da vaeVictis »

Scusami, non avevo capito che intendessi internamente a grub.cfg :)
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once, but I fear the man who has practiced one kick 10000 times.»
Avatar utente
iononsbalgiomai
Rampante Reduce
Rampante Reduce
Messaggi: 7120
Iscrizione: martedì 29 novembre 2011, 15:50

Re: Chiarimento variabili in script /bin/sh

Messaggio da iononsbalgiomai »

La cosa che mi dà noia è che la documentazione di Grub si limita a dire:
grub.cfg is written in GRUB’s built-in scripting language, which has a syntax quite similar to that of GNU Bash and other Bourne shell derivatives.
Non trovo però informazioni su questo linguaggio, mah...
Non aprire una discussione se prima non hai cercato una soluzione nel Wiki né fatto una ricerca nel forum ;)
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4346
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 18.04.4 64bit

Re: Chiarimento variabili in script /bin/sh

Messaggio da vaeVictis »

iononsbalgiomai ha scritto:
venerdì 11 giugno 2021, 19:55
La cosa che mi dà noia è che la documentazione di Grub si limita a dire:
grub.cfg is written in GRUB’s built-in scripting language, which has a syntax quite similar to that of GNU Bash and other Bourne shell derivatives.
Non trovo però informazioni su questo linguaggio, mah...
Condivido. Quando hai aperto la discussione avevo fatto alcune ricerche ma sono rimasto frustrato.
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once, but I fear the man who has practiced one kick 10000 times.»
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8165
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: Chiarimento variabili in script /bin/sh

Messaggio da crap0101 »

iononsbalgiomai ha scritto:
venerdì 11 giugno 2021, 19:55
La cosa che mi dà noia è che la documentazione di Grub si limita a dire:
grub.cfg is written in GRUB’s built-in scripting language, which has a syntax quite similar to that of GNU Bash and other Bourne shell derivatives.
Non trovo però informazioni su questo linguaggio, mah...
questa pagina si? https://www.gnu.org/software/grub/manua ... pting.html
in effetti qualcosa dice ma non è chiarissimo se tutto il resto sia da considerarsi esistente e compatibile con bash (e con quale versione). Bisognerebbe vedere nei sorgenti come trattano la questione ma potrebbe diventare una cosa lunga!
UbuNuovo ha scritto:
giovedì 10 giugno 2021, 20:21
@crap0101: Ciao, non sparire di nuovo. :)
ci provo :-D
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
Avatar utente
iononsbalgiomai
Rampante Reduce
Rampante Reduce
Messaggi: 7120
Iscrizione: martedì 29 novembre 2011, 15:50

Re: Chiarimento variabili in script /bin/sh

Messaggio da iononsbalgiomai »

crap0101 ha scritto:
sabato 12 giugno 2021, 17:13
iononsbalgiomai ha scritto:
venerdì 11 giugno 2021, 19:55
La cosa che mi dà noia è che la documentazione di Grub si limita a dire:
grub.cfg is written in GRUB’s built-in scripting language, which has a syntax quite similar to that of GNU Bash and other Bourne shell derivatives.
Non trovo però informazioni su questo linguaggio, mah...
questa pagina si? https://www.gnu.org/software/grub/manua ... pting.html
in effetti qualcosa dice ma non è chiarissimo se tutto il resto sia da considerarsi esistente e compatibile con bash (e con quale versione). Bisognerebbe vedere nei sorgenti come trattano la questione ma potrebbe diventare una cosa lunga!
Beh dai, è gia qualcosa, anche se un po' corta. Mi pare non chiarisca questa particolarità delle funzioni.



Edit:
iononsbalgiomai ha scritto:
venerdì 11 giugno 2021, 11:58
P.S.: questo generico chiarimento sull'uso delle variabili è finalizzato alla realizzazione di questa pagina wiki, attualmente in costruzione: iononsbalgiomai/grubenv
Se rilevate qualcosa da correggere nello specifico della guida, ne parliamo qui.
Nel frattempo la pagina è stata pubblicata: AmministrazioneSistema/Grub/Errori/ErroreSparseFileNotAllowed
Non aprire una discussione se prima non hai cercato una soluzione nel Wiki né fatto una ricerca nel forum ;)
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8165
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: Chiarimento variabili in script /bin/sh

Messaggio da crap0101 »

iononsbalgiomai ha scritto:
sabato 12 giugno 2021, 19:17
Nel frattempo la pagina è stata pubblicata: AmministrazioneSistema/Grub/Errori/ErroreSparseFileNotAllowed
:birra:
si potrebbe pensare di fare uno script per compilare con i parametri del caso e automatizzare tutte le noiose sostituzioni.
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
Avatar utente
iononsbalgiomai
Rampante Reduce
Rampante Reduce
Messaggi: 7120
Iscrizione: martedì 29 novembre 2011, 15:50

Re: [Risolto] Chiarimento variabili in script /bin/sh

Messaggio da iononsbalgiomai »

Sì ci avevo pensato, ma non né sarei capace :)
Se avete idee relative alla guida parliamone nella discussione dedicata, altrimenti qui andiamo O.T.
Non aprire una discussione se prima non hai cercato una soluzione nel Wiki né fatto una ricerca nel forum ;)
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 1 ospite