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
Lepaskan: 2024-12-05 22:22:10
asal
480 orang telah melayarinya

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 });
Salin selepas log masuk

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();
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan