2012-12-24 14 views
9

Sono in grado di eseguire un comando Linux tramite la classe RunTime. C'è un modo di impostare un ambiente globale Linux da Java in modo programmatico?Imposta la variabile di ambiente Linux a livello di codice in Java

voglio emulare la seguente dichiarazione di comando di Linux su Java

[email protected]:/tmp# export TEST=v2 

ho usato ProcessBuilder come seguendo, ma variabile test non è cambiato.

ProcessBuilder pb = new ProcessBuilder("/bin/bash","-c","export TEST=v3" + "&& exec"); 

UPDATE: In realtà il mio obiettivo finale è quello di utilizzare EMAIL_NAME ambiente come un indirizzo di posta elettronica, quando entrambi la mia domanda e la macchina sono avviati e stopeed queste azioni saranno inviati a EMAIL_NAME. In questo caso capisco che non è possibile impostare l'ambiente globale di linux su puro codice Java. Quindi ho una soluzione alternativa: EMAIL_NAME sarà conservato in un file e verrà aggiornato o letto dallo script linux o dal codice java. variabili

+0

Cosa intendi con comando 'Linux' qui? –

+0

Se si utilizza un 'ProcessBuilder', è possibile avere una mappa mutabile dell'ambiente usando' .environment() 'e modificare quella mappa - prima di eseguire il comando, naturalmente. – fge

+0

Risposte simili: http://stackoverflow.com/questions/580085/is-it-possible-to-set-an-environment-variable-at-runtime-from-java - sebbene l'uso di 'ProcessBuilder' imposterà solo l'ambiente per tutti i processi biforcati (i processi vengono eseguiti come invocati dal processo Java). – birryree

risposta

9

Ambiente, quando insieme, sono disponibili solo per i processi generati dal processo in cui è impostata la variabile, quindi se siete veramente chiedendo di impostare una variabile che interesserà l'intero sistema, allora no. Non si può davvero fare tutto questo in Linux in modo interattivo. Il meglio che si può fare è modificare uno dei file di avvio del sistema in modo da includere tale variabile in modo che tutto ciò che si fa nella futura includa quella variabile.

Se si sta semplicemente cercando di eseguire diversi processi con qualche set di variabili, quindi ProcessBuilder consente di set an environment per i processi generati con esso. Riutilizzare un ambiente per diversi processi è piuttosto banale.

-1

Io uso questa riga di codice nel bash

echo -e PATH=\"/usr/lib/jvm/java-7-openjdk-i386/bin:\$PATH\" >> $HOME/.profile 

con concatena il percorso del utente locale

+0

Questo dovrebbe probabilmente essere un commento; non una risposta. La domanda era, * Impostare la variabile d'ambiente Linux a livello di codice in Java *. Perché dovresti fornire una ricetta Bash quando l'OP ha chiesto espressamente per * "programmaticamente in Java" *? – jww

2

Quando si dice "ambiente globale Linux", vuoi dire variabile d'ambiente Linux? Se è così, penso che la risposta sia NO. Perché non è un problema java. Quando un processo imposta ambiente var, può solo influire su se stesso e sui suoi figli.

+1

Non è un problema Java in quanto tale, vero?Se avvio una nuova finestra di terminale, eseguo "export TEST = v2" e quindi esco, non esisterà nell'ambiente del processo principale. Lo stesso vale se scrivo in C, C++, pascal, assembler, Java, Python o qualsiasi altra lingua che possiamo pensare. –

+0

@MatsPetersson Il mio errore di battitura. Ho appena scoperto di aver perso NOT. Intendevo "non è un problema java". – TieDad

+0

Ah, sì, questo rende l'intera frase molto meglio! –

1

è possibile aggiornare la variabile in/etc/profile attraverso java

if(System.getProperty("TEST", "").equalsIgnoreCase("")) 
{ 
    Runtime.getRuntime().exec(new String[]{"bash","-c" ,"echo 'export TEST=v2' >> /etc/profile"}) ; 

    /// Also update the System Variable for current process 
    System.setProperty("TEST","v2") ; 
} 

E questo otterrà in vigore dal prossimo login o se non in modo esplicito lo legge.

+0

ogni volta che ci sarà un nuovo test TEST inserito in/etc/profile. –

+0

Solo se si esegue il programma java ogni volta. Suppongo che tu voglia eseguirlo solo una volta. D'altra parte/etc/profile verrà eseguito ogni volta che un utente effettua l'accesso. –

+0

Inoltre se si pianifica di eseguire il programma Java ogni volta .. allora probabilmente dovresti controllare prima se la variabile esiste. System.getProperty ("TEST ") .. se non esiste, impostalo sia nell'ambiente di processo corrente e/etc/profile –

Problemi correlati