سؤال

وأود أن استدعاء باش باستخدام سلسلة كإدخال. شيء من هذا القبيل:

sh -l -c "./foo"

وأود أن القيام بذلك من جافا. للأسف، عندما أحاول أن استدعاء الأوامر باستخدام getRuntime().exec، وأحصل على الخطأ التالي:

      foo": -c: line 0: unexpected EOF while looking for matching `"'

      foo": -c: line 1: syntax error: unexpected end of file

ويبدو أن لهما صلة سلسلة بلدي لم يتم إنهاؤها مع EOF.

هل هناك طريقة لادخال منصة EOF محددة إلى سلسلة جافا؟ أو ينبغي أن تكون تبحث عن طريقة أخرى، مثل كتابة لسيناريو مؤقت قبل استدعاء "ش"؟

هل كانت مفيدة؟

المحلول

استخدم هذا:

Runtime.getRuntime().exec(new String[] {"sh", "-l", "-c", "./foo"});

وأهم نقطة:.! لا تضع علامات الاقتباس المزدوجة في ذلك انها تستخدم فقط عند كتابة سطر الأوامر في وعاء

.

ومنها مثلا، ويحصل على ترجمتها echo "Hello, world!" (كما كتبته في وعاء) إلى:

Runtime.getRuntime().exec(new String[] {"echo", "Hello, world!"});

و(ينسوا للحظة أن قذيفة ديه عادة المضمن لecho، وتدعو /bin/echo بدلا من ذلك: -))

نصائح أخرى

ويندوز أسطر الأوامر بشكل مختلف من UNIX، و Mac OS X و جنو / لينكس.

في ويندوز يتلقى عملية إدخال النص كما هو بعد اسم executeable (والمكان). انها ثم يصل إلى البرنامج لتحليل سطر الأوامر (والتي عادة ما يتم ضمنيا ومبرمج غالبا ما يكون جاهل).

في جنو / لينكس قذيفة بمعالجة سطر الأوامر وgnereates مجموعة مألوفة من السلاسل التي تم تمريرها إلى الرئيسي C. لم يكن لديك أن قذيفة. أفضل نهج (حتى على ويندوز) هو استخدام شكل إكسيك حيث يمكنك تمرير كل سيطة سطر الأوامر بشكل فردي في سلسلة خاصة بها.

ويمكنك الحصول على قذيفة لإعراب بالنسبة لك إذا كنت تريد حقا. التي من شأنها أن تجعلك تبدو مثل شيء من هذا القبيل (غير مجربة):

Runtime.getRuntime().exec(new String[] {
    "sh", "-c", "sh -l -c \"echo foo; echo bar;\""
});

وEOF ليست شخصية، لذلك ليس هناك طريقة لكتابة EOF. كنت قد نسيت لإغلاق سلسلة مقتبسة.

وسبب هذا الخطأ هو الأكثر احتمالا بناء الجملة المفقودة يتوقع أن رمز باش ولكن السلسلة التي تمر ينتهي قبل اجه باش ذلك. ابحث عن المؤسسة الدولية للعلوم، فوريس الخ التي ليس لها فاي إغلاق أو القيام به.

لا بد من هرب عندما داخل سلسلة

والأسعار. بدلا من كتابة "الكتابة \".

ومنها مثلا.

وstrcpy (ج، "هذا هو سلسلة \" مع \ "يقتبس")؛

وإذا كنت أنت، وأود أن أكتب محتويات السلسلة إلى bashfile مؤقت ومعرفة ما إذا كان تنفيذ باش أنه من دون أي خطأ. إذا الذي ينفذ بدون خطأ، ثم أود أن تنظر التصحيح أبعد؛

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top