Uso pratico dell'opzione `set -k` in bash


16

Quando usiamo l' set -kopzione in bash?

Il manuale di riferimento di Bash dice:

Tutti gli argomenti sotto forma di istruzioni di assegnazione vengono inseriti nell'ambiente per un comando, non solo quelli che precedono il nome del comando.

Capisco cosa fa l'opzione, ma non riesco a immaginare quando ne abbiamo bisogno.


Percezione corretta. Il -kci 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 ...
Henk Langeveld

Risposte:


14

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 exportnell'elenco prima di eseguire i comandi .

NOTA: C'è anche la forma lunga del -kcommutatore, 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 VARal 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 -ksta 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 -ksta 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.

In questo link, ss64.com/bash/set.html , set -kpoiché hanno fornito -o keywordoltre -kall'opzione. Significa qualcosa?
Ramesh,

@Ramesh - set -o keywordè la forma lunga di set -k. Vedere help set | grep -- '-k'.
slm

Ah ok. Mi sono grattato la testa per molto tempo cercando di capire perché ci sono 2 opzioni. Come sempre risposta perfetta :)
Ramesh

4
./cmd.bash VARCMD=hiha bisogno set -kdi farlo funzionare esattamente come VARCMD=hi ./cmd.bashfa senza set -k. Suppongo che la domanda specifica del PO ./cmd.bash VARCMD=hi
riguardi

@ 1_CR - buon punto. Credo che abbia a che fare con lo stile più di ogni altra cosa, vedrò se riesco a trovare una fonte reale però.
slm

8

Qualsiasi utilizzo pratico set -kè probabilmente solo uno stile personale. Alcuni - forse quelli a cui piacciono i linguaggi di programmazione che offrono la possibilità di utilizzare argomenti di parole chiave nelle chiamate di funzione o quelle poche persone a cui piace la ddsintassi del comando - potrebbero preferire

set -k
...
comando var 1 = val 1 var 2 = val 2

per

var 1 = val 1 var 2 = comando
 val 2

Il vero motivo per cui esiste l'opzione in alcune shell è spiegato nella logica del comando set nello standard POSIX :

The following set flags were omitted intentionally with the following rationale:

The -k flag was originally added by the author of the Bourne shell to make it easier
for users of pre-release versions of the shell. In early versions of the Bourne shell
the construct
    set name=value
had to be used to assign values to shell variables.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.