java - 如何使用java程序执行oraenv脚本?

标签 java linux oracle shell unix

如何使用java程序执行oraenv脚本?我如何从 Linux 终端执行。

 [oracle@DeltaLinOraASM2 tmp]$ . oraenv
 ORACLE_SID = [oracle] ? deltaasm
 The Oracle base has been set to /u01/app/oracle
 [oracle@DeltaLinOraASM2 tmp]$

我的 oraenv 脚本文件包含以下内容:

export ORACLE_HOME=/opt/oracle/product/12.2.0.1/dbhome_1
export PATH=$PATH:$ORACLE_HOME/bin
export ORACLE_SID=deltaasm

如何使用java程序执行oraenv文件。

它在询问 ORACLE_SID= ?执行脚本后。但是从程序中它没有被执行。

public class App2 {

public static String RunLinuxGrepCommand(String command) {
    String line = null;
    String strstatus = "";
    try {

        String[] cmd = { "/bin/sh", "-c", command };
        Process p = Runtime.getRuntime().exec(cmd);
        BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
        while ((line = in.readLine()) != null) {
            strstatus = line;
        }
        in.close();
    } catch (Exception e) {

        StringWriter sw = new StringWriter();
        PrintWriter pw = new PrintWriter(sw);
        e.printStackTrace(pw);
        pw.flush();
        String stackTrace = sw.toString();
        int lenoferrorstr = stackTrace.length();
        if (lenoferrorstr > 500) {
            strstatus = "Error:" + stackTrace.substring(0, 500);
        } else {
            strstatus = "Error:" + stackTrace.substring(0, lenoferrorstr - 1);

        }
    }
    System.out.println("strstatus" + strstatus);
    return strstatus;

}

public static void main(String[] args) throws IOException {

    String str = ". oraenv ; deltaasm ";
    App2.RunLinuxGrepCommand(str);

}
}

enter image description here

最佳答案

您需要了解在 Java 中使用 exec 时会发生什么:

  1. 创建了一个新的外部流程。
  2. 进程执行你给的命令
  3. 进程退出。

例如,如果您这样做:

  exec(". oraenv");
  exec("someOracleCommand");

会发生什么:

  1. 第一个流程已创建。
  2. 第一个进程执行“.oraenv”设置环境变量为该进程
  3. 第一个进程退出。
  4. 第二个流程已创建。
  5. 第二个进程在默认环境下执行“someOracleCommand”。
  6. 第二个进程退出。

看到问题了吗?环境变量设置不会从第一个进程传递到第二个进程。

其实我上面说的都是假的。那样运行“.oraenv”在任何情况下都行不通。这 ”。” command 是 shell 内置命令,除非您正在运行 shell,否则不可用。上面没有做的。 exec(".orenv") 将失败。

解决方案:您需要运行 。 oraenv 和同一 shell 中的命令,如下所示:

  exec("/bin/bash", "-c",
       ". oraenv ; someOracleCommand");

我们所做的是将 shell 命令序列放入一行,并将其传递给 shell 以执行。 shell 了解如何解析命令序列...并将在 shell 环境中设置环境变量,以便它们可用于在 shell 中运行的以下命令。

关于java - 如何使用java程序执行oraenv脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50351916/

相关文章:

python - 使用python获取密码

linux - Apache HTTPS URL 重写

oracle - 加载到 oracle 的替代方案

java - Youtube API 在 Android 上不可能吗?

java - 连接多个结果集

c - Makefile .c + .as 与 ncurses

oracle - PL/SQL嵌套表中STORE AS的含义

java - 有或没有持有者的单例 = 惰性初始化 vs 急切初始化?

java - 画得太快时椭圆形不相连

Oracle - 在不打开另一个连接的情况下验证用户和密码?