2015-06-09 14 views
5

Esiste un modo per esportare una variabile d'ambiente con una barra nel nome, ad esempio:Come impostare le variabili di ambiente con una barra nella chiave

export /myapp/db/username=someval

This post indica che dovrebbe essere possibile, ma io non riesco a trovare una sintassi valida per farlo.

Per sfondo:

Sto usando confd per produrre file di configurazione da un modello e chiavi. I negozi tipici (console, etcd) usano chiavi gerarchiche come /myapp/db/username. Mi piacerebbe consentire in modo trasparente il passaggio tra l'utilizzo di un provider basato su variabili d'ambiente e un archivio di configurazione che sfrutta le chiavi gerarchiche.

+0

Normalmente suggerisco l'uso di un array associativo. 'Dichiara -A a; un [/ frontend/db/username] = someval'. L'unico problema è che gli array non possono essere esportati. – anishsane

risposta

1

export contrassegna solo identificatori di shell validi da esportare nell'ambiente, non stringhe che potrebbero formare una coppia nome/valore valida nell'ambiente. È possibile utilizzare env per creare una nuova istanza di shell con tale ambiente, tuttavia.

env "/myapp/db/username=someval" bash 
+0

Molto interessante, non sapevo che fosse possibile. Come faresti riferimento a tale variabile dalla shell, però? '$ {/ myapp/db/username}' viene confuso per la sostituzione errata, e non sembra che ci sia un array speciale che contiene variabili di ambiente. – ghoti

+0

Non puoi. La shell può interfacciarsi con l'ambiente solo attraverso l'obiettivo delle variabili di shell. Può solo leggere e scrivere sull'ambiente stringhe del formato 'NOME = VALORE' dove' NOME' è un identificatore di shell valido e 'VALUE' può essere facoltativamente vuoto. Non ci sarebbe alcun motivo per la shell di richiedere un supporto più ampio, perché l'unica ragione per aggiungere altri tipi di stringhe sarebbe a vantaggio di un nuovo programma, ma è possibile farlo tramite 'env'. – chepner

4

Sì, è possibile esportare tale variabile di ambiente ma non da un'istruzione bash export.

Mentre bash rifiuterà di creare una variabile di ambiente denominata, ad esempio, a/b, possiamo crearla con python e le subshell create da python la vedranno.

A titolo di esempio, si consideri il seguente comando python:

$ python -c 'import os; os.environ["a/b"]="2"; os.system("/bin/bash");' 

Se corriamo questo comando, si sono messi in una subshell. Da quel subshell, possiamo vedere che la creazione della variabile di ambiente ha avuto successo:

$ printenv | grep a/b 
a/b=2 

(A questo punto, uno potrebbe voler uscire dalla subshell (tipo exit o CTRL-D) per tornare al programma python che uscirà e tornerà alla shell principale.)

Problemi correlati