Puoi praticamente usarlo ogni volta che vuoi "iniettare" le variabili di ambiente passate in uno script di shell (come argomenti) come se fossero state impostate all'interno dell'ambiente via export
, ma senza doverle risiedere permanentemente export
nell'elenco prima di eseguire i comandi .
NOTA: C'è anche la forma lunga del -k
commutatore, set -o keyword
.
Esempio
$ cat cmd1.bash
#!/bin/bash
echo $VARCMD
Ora se io set -k
:
$ set -k; ./cmd1.bash VARCMD="hi"; set +k
hi
Ma se dovessi solo eseguire lo script sopra:
$ ./cmd1.bash
$
Cosa sta facendo l'esportazione?
$ help export
...
Marks each NAME for automatic export to the environment of subsequently
executed commands. If VALUE is supplied, assign VALUE before exporting.
...
Quindi, se dovessimo aggiungere export | grep VAR
al nostro script in questo modo:
$ cat cmd2.bash
#!/bin/bash
echo $VARCMD
export | grep VAR
E abbiamo eseguito di nuovo i nostri test di cui sopra:
$ set -k; ./cmd2.bash VARCMD="hi"; set +k
hi
declare -x VARCMD="hi"
Ma senza set -k
:
$ ./cmd2.bash
$
Quindi ci set -k
sta permettendo di esportare temporaneamente variabili in massa.
Un altro esempio
$ cat cmd3.bash
#!/bin/bash
echo $VARCMD1
echo $VARCMD2
export | grep VAR
Quando impostiamo più variabili, vengono tutte esportate:
$ set -k; ./cmd3.bash VARCMD1="hi" VARCMD2="bye"; set +k
hi
bye
declare -x VARCMD1="hi"
declare -x VARCMD2="bye"
Quindi sta solo iniettando tutte le variabili di ambiente?
No -k
sta facendo una cosa molto esplicita qui. Esporta solo le variabili che sono state incluse nella riga di comando quando è stato eseguito un comando.
Esempio
Dire che ho impostato questa variabile:
$ VARCMD1="hi"
Ora quando eseguiamo lo stesso comando omettendo VARCMD1="hi"
:
$ set -k; ./cmd3.bash VARCMD2="bye"; set +k
bye
declare -x VARCMD2="bye"
Ma perché esiste?
Ho trovato questa fonte che spiega un po 'di questa funzione, intitolata: "Stringhe di assegnazione dei parametri delle parole chiave". NOTA: l'URL di origine utilizza un indirizzo IP, quindi non posso collegarlo direttamente qui su SE.
http://140.120.7.21/OpenSystem2/SoftwareTools/node16.html
Durante la programmazione in qualsiasi linguaggio, la variabile e il suo passaggio di valore sono fondamentali per la scrittura di codice affidabile. Oltre ai tipi di variabili integer e array, tutte le altre variabili shell accettano le stringhe come valori. Quando parliamo del linguaggio di programmazione della shell, per essere coerenti, preferiamo la frase "parametro parola chiave". Ecco alcuni punti a cui prestare attenzione quando si assegnano valori ai parametri delle parole chiave:
Per evitare effetti imprevisti, posizionare sempre la sottostringa di assegnazione dei parametri davanti a una stringa di comando.
Nella shell B, i valori assegnati dei parametri delle parole chiave verranno memorizzati in variabili di shell (locali). In bash e ksh, le stringhe di assegnazione dei parametri delle parole chiave che precedono il comando non verranno memorizzate nelle variabili della shell. Influiscono solo sul sottoprocesso immediato che viene eseguito per eseguire il comando corrente. Una sola riga di stringhe di assegnazione dei parametri delle parole chiave viene memorizzata nelle variabili di shell (locali). Le stringhe di assegnazione dei parametri delle parole chiave possono anche apparire come argomenti per i comandi alias, declare, typeset, export, readonly e local builtin. [Sezione 3.4 del Manuale di riferimento di Bash]
Le stringhe di assegnazione dei parametri delle parole chiave verranno trattate come argomenti per l'esecuzione del comando, se posizionate dopo il nome del comando.
- I parametri della parola chiave possono essere manipolati dal comando set.
-k
ci permette di eseguire gli script di shell di 30 anni senza la necessità di refactoring loro. Passa invece le variabili di ambiente temporanee utilizzando la sintassi del prefisso:var1=x var2=y command ...