Как выполнить и прочитать 2 терминальные команды в одном процессе на MacOS в Java - PullRequest
0 голосов
/ 17 января 2020

Я пытаюсь создать Android Studio Plugin, который позволяет мне копировать мои измененные файлы (Git) в буфер обмена. Я могу получить путь root, в котором находится файл. git. Затем я хочу выполнить команду git diff --name-only по этому пути. Поэтому сначала я должен выполнить cd <path>. Я в состоянии выполнить один за другим, но не стенд с оператором && fe. Тогда во входном потоке ничего нет. Это потому, что я сейчас работаю над Ма c, который требует других команд? Я искал решение несколько часов, но, похоже, ничего не работает.

Вот мой подход:

class MyAction: AnAction() {

    override fun actionPerformed(event: AnActionEvent) {
        println("Action Performed")


        val path = ModuleRootManager.getInstance(ModuleManager.getInstance(event.project!!).modules[0]).contentRoots[0].path
        println("Path: $path")

        try {
            runCommand(path, "git diff --name-only")
        } catch (e: Exception) {
            e.printStackTrace()
            println("Path is incorrect")
        }

    }

    private fun runCommand(path: String, command: String) {
        val rt = Runtime.getRuntime()
        val pathCommand = "cd $path "

        val proc = rt.exec(pathCommand + "&& " + command)

        printInput(proc)
    }

    private fun printInput(proc: Process) {
        printProcessInput(proc)
        printProcessError(proc)
    }

    private fun printProcessInput(proc: Process) {
        println("Here is the standard output of the command:\n")
        printStream(proc.inputStream)
    }
    private fun printProcessError(proc: Process) {
        println("Here is the standard error of the command (if any):\n")
        printStream(proc.errorStream)
    }

    private fun printStream(stream: InputStream) {
        val stdInput = BufferedReader(InputStreamReader(stream))
        var s: String?
        while (stdInput.readLine().also { s = it } != null) {
            println(s)
        }
    }
}

1 Ответ

0 голосов
/ 17 января 2020

Я нашел решение. Если вы хотите перейти к каталогу и выполнить там команду, вы можете использовать ProcessBuilder и определить каталог следующим образом:

private fun runProcess(path: String): Process {
        val file = File(path)
        val processBuilder = ProcessBuilder()

        return processBuilder.command("git", "diff", "--name-only")
            .directory(file)
            .start()
    }
...