Rumah >Java >javaTutorial >Bagaimana untuk Melaksanakan Perintah Bash dengan Amanah dan Menangkap Outputnya di Java?

Bagaimana untuk Melaksanakan Perintah Bash dengan Amanah dan Menangkap Outputnya di Java?

Susan Sarandon
Susan Sarandonasal
2024-12-19 11:19:14674semak imbas

How to Reliably Execute Bash Commands and Capture Their Output in Java?

Melaksanakan Perintah dengan Aliran Input/Output dalam Java

Tinjauan Keseluruhan Masalah

Anda berhasrat untuk mencipta program Java yang melaksanakan arahan dalam shell bash dan mengumpul keluaran mereka. Walau bagaimanapun, anda menghadapi masalah dengan berbilang aliran keluaran tidak berfungsi selepas bacaan pertama dan pengecualian "Paip pecah".

Penyelesaian

1. Gunakan ProcessBuilder:

Ganti Proses Proses = Runtime.getRuntime().exec("/bin/bash"); dengan:

ProcessBuilder builder = new ProcessBuilder("/bin/bash");
builder.redirectErrorStream(true);
Process process = builder.start();

ProcessBuilder membenarkan untuk mengubah hala ralat standard ke dalam output standard, menghapuskan keperluan untuk benang berasingan untuk stderr dan stdout.

2. Tunggu Penyiapan Output:

Bacaan gelung daripada strim output (reader.readline()) akan disekat sehingga proses keluar atau menghantar fail akhir. Untuk mengelakkan hang, pastikan gelung berulang hanya apabila output yang dijangkakan telah diterima.

3. Gunakan "Garis Ajaib" untuk Menandai Output Tamat:

Untuk menentukan dengan pasti apabila output daripada arahan yang dilaksanakan selesai, pertimbangkan untuk menulis baris tertentu (cth., "--EOF--") untuk memberi isyarat tamat keluaran. Teknik ini, yang ditunjukkan dalam coretan kod di bawah, membantu mengendalikan senario di mana proses itu tidak ditamatkan dengan aksara baris baharu:

while (scan.hasNext()) {
    String input = scan.nextLine();
    if (input.trim().equals("exit")) {
        writer.write("exit\n");
    } else {
        writer.write("((" + input + ") && echo --EOF--) || echo --EOF--\n");
    }
    writer.flush();

    line = reader.readLine();
    while (line != null && ! line.trim().equals("--EOF--")) {
        System.out.println("Stdout: " + line);
        line = reader.readLine();
    }
    if (line == null) {
        break;
    }
}

Penghadan

  • Penyelesaian adalah terhad dalam mengendalikan arahan yang menunggu input pengguna atau menjana output tanpa baris baharu.
  • Ia menganggap arahan mengeluarkan a --EOF-- baris.
  • Penggunaan kurungan dalam arahan bertulis boleh menyebabkan ralat sintaks dalam bash.

Nota: Pendekatan ini memastikan semua output daripada arahan yang dilaksanakan ditangkap sebelum arahan lain dimasukkan. Ia membenarkan pelaksanaan berterusan arahan dalam tugas berjadual berulir tanpa menghadapi pengecualian "Paip pecah".

Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Perintah Bash dengan Amanah dan Menangkap Outputnya di Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn