Cosa fanno 'set' ed 'export' di bash-builtin?


46

Sono in perdita per quanto riguarda lo scopo di sete exportin Bash (e immagino che probabilmente anche altre conchiglie).

Penserei che sia per impostare le variabili d'ambiente, ma si può fare solo con VARIABLE=VALUE, giusto?

Anche digitando sete exportda soli mostrano valori diversi.

Quindi qual è il loro scopo?



Comincio sempre dallo script bash con i seguenti due. #! / usr / bin / env bash set -euxo pipefail Questo link spiega magnificamente lo stesso. coderwall.com/p/fkfaqq/…
147.3k

Risposte:


50

exportesporta verso i figli del processo corrente, per impostazione predefinita non vengono esportati. Per esempio:

$ foo=bar
$ echo "$foo"
bar
$ bash -c 'echo "$foo"'

$ export foo
$ bash -c 'echo "$foo"'
bar

setd'altra parte, imposta gli attributi della shell, ad esempio i parametri posizionali.

$ set foo=baz
$ echo "$1"
foo=baz

Si noti che baznon è assegnato a foo, diventa semplicemente un parametro posizionale letterale. Ci sono molte altre cose che setpossono fare (principalmente opzioni di shell), vedi help set.

Per quanto riguarda la stampa, exportchiamato senza argomenti stampa tutte le variabili nell'ambiente della shell. setstampa anche le variabili che non vengono esportate. Può anche esportare alcuni altri oggetti (anche se dovresti notare che questo non è portatile), vedi help export.


Grazie è una risposta molto utile. Tuttavia, quando imposto http_proxy solo con http_proxy = abc.com , è visibile ai processi figlio, ad esempio eseguendo wget senza che io lo esporti. Come può essere?
mydoghasworms

2
@mydoghasworms Due possibili ragioni. Uno, stai eseguendo il comando come foo=bar command. Questa è un'esportazione implicita per un singolo comando. La seconda possibilità è che http_proxysia già esportato nel tuo ambiente prima di modificarlo.
Chris Down

Ah sì, hai ragione. Fantastico, grazie!
mydoghasworms

6

Vedi help set: set è usato per impostare gli attributi della shell e gli attributi posizionali.

Le variabili che non vengono esportate non sono ereditate dai processi figlio. exportviene utilizzato per contrassegnare una variabile per l'esportazione.

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.