ج شل:كيفية تنفيذ البرنامج مع غير سطر الأوامر الحجج ؟

StackOverflow https://stackoverflow.com/questions/224038

  •  03-07-2019
  •  | 
  •  

سؤال

بلدي $قذيفة tcsh.أريد أن أجرب ج شيل أنه سيتم استدعاء البرنامج عدة مرات مع بعض الحجج يتغير في كل مرة.البرنامج لا تحتاج إلى استدعاء في Fortran.أنا لا ترغب في تحريره.البرنامج يستغرق سوى الحجج مرة واحدة يتم تنفيذها ، ولكن ليس على سطر الأوامر.عند استدعاء البرنامج النصي يأخذ البرنامج التحكم (هذا هو المكان الذي أنا عالقة حاليا, أنا لا يمكن أبدا الخروج لأن السيناريو سوف يتم تنفيذ أي شيء حتى بعد البرنامج توقف العملية);عند هذه النقطة تحتاج إلى تمرير بعض المتغيرات ، ثم بعد عدة تكرارات سوف تحتاج إلى ctrl-c من برنامج تواصل مع البرنامج النصي.

كيف يمكن القيام بذلك ؟

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

المحلول

إضافة إلى ما @Toybuilder قال ، يمكنك استخدام "هنا الوثيقة".أولا-هاء.البرنامج النصي الخاص بك يمكن أن يكون

./myfortranprogram << EOF
first line of input
second line of input
EOF

كل شيء بين "<<EOF"و "EOF"سيتم تغذية البرنامج الإدخال القياسي (لا Fortran لا تزال تستخدم "قراءة (5,*)" على قراءة من المدخلات القياسية?)

و لأنني أعتقد @ephemient تعليق يستحق أن يكون في الجواب:

بعض النصائح:<<'EOF' يمنع الاستيفاء في هنا-doc الجسم ؛ <<-EOF إزالة كافة علامات التبويب الرائدة (حتى يمكنك إضافة مسافة بادئة هنا-doc إلى المباراة المناطق المحيطة بها) ، EOF يمكن الاستعاضة عن أي رمز.فارغة المميز (<<"") تشير إلى هنا-doc التي توقف في أول سطر فارغ.

لست متأكدا كيف المحمولة أولئك هم ، أو إذا كانوا فقط tcsh ملحقات - لقد استخدمت <<EOF نوع "هنا" وثيقة نفسي.

نصائح أخرى

ما تريد استخدامه هو يتوقع.

أوه، هل يمكنك تغذية رمز فورتران الخاص بك بإعادة التوجيه؟يمكنك إنشاء ملف مؤقت باستخدام مدخلاتك، ثم توصيله باستخدام إعادة توجيه stdin (<).

ليس أ tcsh المستخدم، ولكن إذا تم تشغيل البرنامج ثم يقرأ الأوامر عبر stdin ثم يمكنك استخدام إعادة توجيه Shell < لإطعامه الأوامر المطلوبة.إذا قمت بتشغيله في الخلفية مع & لن تقوم بحظره عند تنفيذه.إذا تستطيع sleep قليلاً، ثم استخدم أي أدوات لديك (ps, grep, awk, الخ) لاكتشاف معرف البرنامج (PID) الخاص بالبرنامج، ثم استخدمه kill لإرساله SIGTERM وهو نفس إجراء ctrl-c.

هذه هي وظيفة برنامج يونكس المتوقع، والذي يمكنه أن يأمر البرامج بشكل تفاعلي وسهل ولطيف ويستجيب لمطالباتها.

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

FWIW، واجهت مشكلة مماثلة مع البرنامج النصي csh C Shell.

كان هذا الجزء من التعليمات البرمجية يسمح للأمر custom_command بالتنفيذ دون الحصول على أي وسيطات إدخال:

foreach f ($forecastTimes)
    custom_command << EOF
        arg1=x$f;2
        arg2=ya
        arg3=z,z$f
        run
        exit
        EOF
end

لم ينجح الأمر في المرة الأولى التي جربتها فيها، ولكن بعد أن قمت بحذف كل المساحة البيضاء في هذا القسم من الكود، قمت بإزالة المسافة بين "<<" و"EOF".لقد قمت أيضًا بإرجاع مسافة الإغلاق "EOF" إلى الهامش الأيسر.بعد ذلك عملت:

foreach f ($forecastTimes)
    custom_command <<EOF
        arg1=x$f;2
        arg2=ya
        arg3=z,z$f
        run
        exit
EOF
end
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top