Rumah >Java >javaTutorial >Mengapa `Runtime.exec(String)` Kadangkala Gagal Melaksanakan Perintah dengan Betul?

Mengapa `Runtime.exec(String)` Kadangkala Gagal Melaksanakan Perintah dengan Betul?

Susan Sarandon
Susan Sarandonasal
2024-12-05 22:22:10464semak imbas

Why Does `Runtime.exec(String)` Sometimes Fail to Execute Commands Correctly?

Mengapa Runtime.exec(String) Berkelakuan Berbeza untuk Perintah Tertentu?

Runtime.exec(String) membenarkan pelaksanaan arahan dalam persekitaran sistem pengendalian asas. Walau bagaimanapun, sementara ia berfungsi dengan lancar untuk beberapa arahan, isu timbul dengan yang lain.

Mengapa Perbezaannya?

Perbezaan utama berpunca daripada fakta bahawa arahan itu tidak dilaksanakan dalam persekitaran cangkang. Cangkang menyediakan perkhidmatan penting yang tidak dijalankan oleh Runtime.exec(String), yang membawa kepada ralat.

Bilakah Kegagalan Berlaku?

Arahan gagal apabila mereka bergantung pada ciri cangkerang, seperti:

  • Pemisahan petikan dan spaces: Runtime.exec(String) berpecah secara naif pada ruang, yang boleh memecahkan hujah seperti "My File.txt" kepada nama fail yang berasingan.
  • Mengembangkan glob dan kad bebas: The shell menulis semula corak seperti *.doc ke dalam fail sebenar. Runtime.exec(String) tidak melakukan pengembangan ini.
  • Mengendalikan paip dan ubah hala: Shell menyediakan ubah hala output, yang Runtime.exec(String) tidak mengendalikan.
  • Meluaskan pembolehubah dan arahan: Cangkang menggantikan pembolehubah dan perintah shell sebelum melaksanakan perintah. Runtime.exec(String) menghantarnya secara literal.

Penyelesaian

Terdapat dua pendekatan untuk mengendalikan situasi ini:

Mewakilkan kepada Shell (Mudah tetapi Ceroboh):

Lulus arahan ke shell (cth., menggunakan Runtime.exec(String[])):

String myCommand = "cp -R '" + myFile + "' $HOME 2> errorlog";
Runtime.getRuntime().exec(new String[] { "bash", "-c", myCommand });

Memikul Tanggungjawab Shell (Secure and Robust):

Menggunakan ProcessBuilder untuk mengendalikan tugas seperti cangkerang, seperti pengembangan pembolehubah, pengalihan semula dan pemisahan perkataan:

String myFile = "some filename.txt";
ProcessBuilder builder = new ProcessBuilder(
    "cp", "-R", myFile,
    System.getenv("HOME")
);
builder.redirectError(ProcessBuilder.Redirect.to(new File("errorlog")));
builder.start();

Atas ialah kandungan terperinci Mengapa `Runtime.exec(String)` Kadangkala Gagal Melaksanakan Perintah dengan Betul?. 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