• Das kreative Thema des Monats Oktober wird vor allem diejenigen unter Euch besonders ansprechen, denen Do-it-yourself quasi im Blut liegt. Zeigt uns Eure Improvisationskünste oder fotografiert, was andere Leute sich so im Alltag zusammengestrickt haben. --> Zum Mitmachen bitte hier klicken

Java PATH auslesen

Thorsten-K

Jonagold
Registriert
11.08.05
Beiträge
23
Hallo,

ich habe ein kleines Problem den Pfad aus Java heraus auszulesen.

System.out.println(System.getenv("PATH"));
---> /usr/bin:/bin:/usr/sbin:/sbin

Im Terminal gibt es jedoch weitere Einträge: echo $PATH
---> /sw/bin:/sw/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:/usr/local/bin:/usr/texbin:/usr/X11R6/bin

Wie komme ich aus Java an den gesamten Pfad? Ich vermute, er wird aus der .profile oder .bash_rc erweitert. ...

Vielen Dank
Thorsten
 
Wie komme ich aus Java an den gesamten Pfad? Ich vermute, er wird aus der .profile oder .bash_rc erweitert. ...

Damit wirst du recht haben.

Ob Java eine native Funktion dafür anbietet, glaube ich eher nicht. Aber vielleicht kommst du durch starten einer neuen Shell per System.execute() und durch ausführen (Und Abfangen der Ausgabe) von "echo $PATH" in dieser Shell an das gewünschte Ergebnis.

Alternative wäre vielleicht noch, die .bash_rc selber zu parsen - wäre allerdings etwas umständlich.
 
Hallo Kenny.

Stimmt, aber die .bash_rc zu parsen wäre nicht nur umständlich, sondern auch fehleranfällig. An System.execute() habe ich auch schon gedacht, aber die Ergebnisse sind leider nicht so, wie gedacht :-(

echo $PATH -> $PATH
sh -c echo $PATH --> (leer)
sh -c \"echo $PATH\" --> (nichts? kein stdout/stderr ??)


Grüße
Thorsten
 
Code:
	public BufferedReader runCommand(String[] cmd, final int timeout) throws Throwable {

		final String[] command = cmd;

		final Thread runcmd = new Thread() {
			@Override
			public void run() {
				try {
					String s = null;
					ExecuteCommand.this.process = Runtime.getRuntime().exec(
							command);					
					if(timeout > 0) {
						long startTime = System.currentTimeMillis();
						while(System.currentTimeMillis() - startTime < timeout) {
							try {
								process.exitValue();
								break;
							} catch(IllegalThreadStateException e) {
							}
							try {
								Thread.sleep(50);
							} catch(InterruptedException e) {
							}
						}
						try {
							process.exitValue();
							int i = process.exitValue();
							if (i == 0) {
								cmdOutput = new BufferedReader(
										new InputStreamReader(
												ExecuteCommand.this.process
														.getInputStream()));
							}
							else {
								ExecuteCommand.this.cmdErrOutput = new BufferedReader(
										new InputStreamReader(
												ExecuteCommand.this.process
														.getErrorStream()));
								// read the output from the command
								while ((s = ExecuteCommand.this.cmdErrOutput
										.readLine()) != null) {
									System.err.println(s);
								}
							}
						} catch(IllegalThreadStateException e) {
							System.err.println("Command: " + command[2]
									+ " did not terminate in time");
							process.destroy();
							process.waitFor();
							cmdOutput = null;
						}
					
					} else {
						int i = ExecuteCommand.this.process.waitFor();
						if (i == 0) {
							cmdOutput = new BufferedReader(
									new InputStreamReader(
											ExecuteCommand.this.process
													.getInputStream()));
						}
						else {
							ExecuteCommand.this.cmdErrOutput = new BufferedReader(
									new InputStreamReader(
											ExecuteCommand.this.process
													.getErrorStream()));
							// read the output from the command
							while ((s = ExecuteCommand.this.cmdErrOutput
									.readLine()) != null) {
								System.err.println(s);
							}
						}
					}
				}
				catch (Exception e) {
					System.err.println(e);
				}
			}
		};

		runcmd.start();
		runcmd.join(TIMEOUT);

		return cmdOutput;
	}