لا تستطيع أن تفعل شيل مع تكرار مع ط من 1 إلى n حلقة
-
07-07-2019 - |
سؤال
وهذا يعمل (طباعة، على سبيل المثال، "3 الحجج"):
to run argv
do shell script "echo " & (count argv) & " arguments"
end run
وهذا لا (يطبع فقط "وسيطة 3: ثلاثة"، وليس حجج السابقتين):
to run argv
do shell script "echo " & (count argv) & " arguments"
repeat with i from 1 to (count argv)
do shell script "echo 'Argument " & i & ": " & (item i of argv) & "'"
end repeat
end run
في كلتا الحالتين، أنا تشغيل البرنامج النصي باستخدام osascript
على نظام التشغيل Mac OS X 10.5.5. مثال الاحتجاج:
osascript 'Script that takes arguments.applescript' Test argument three
وأنا لا إعادة توجيه الإخراج، إذا كنت لا تعرف أن السيناريو لا يلقون خطأ.
إذا أضيف بيان display dialog
فوق do shell script
، فإنه يلقي "لا تفاعل المستخدم يسمح" خطأ، لذلك وأنا أعلم أنه يتم تنفيذ جسم الحلقة.
وماذا أفعل الخطأ؟ ما هو حول هذه الحلقة التي تسبب osascript لعدم طباعة أي شيء؟
المحلول
وهذه محاولة لتجنب الاضطرار إلى استخدام الملف المؤقت.
to run argv
set accumulator to do shell script "echo " & (count argv) & " arguments" altering line endings false
repeat with i from 1 to (count argv)
set ln to do shell script "echo 'Argument " & i & ": " & (item i of argv) & "'" altering line endings false
set accumulator to accumulator & ln
end repeat
return accumulator
end run
نصائح أخرى
ومشكلتكم يبدو أن لا علاقة لها حلقة، أو استخدام ARGV، لهذه المسألة. وهنا حالة اختبار أبسط من ذلك بكثير حيث لا يوجد سوى do shell script
آخر يعود في الواقع نتيجة لذلك:
do shell script "echo foo"
delay 2
do shell script "echo bar"
وبالإضافة إلى ذلك، تغيير طفيف التالية سوف تنتج النتائج المتوقعة:
to run argv
do shell script "echo " & (count argv) & " arguments > /test.txt"
repeat with i from 1 to (count argv)
do shell script "echo 'Argument " & i & ": " & (item i of argv) & "' >> /test.txt"
end repeat
end run
وtest.txt
سوف يحتوي على أربعة خطوط، كما يلي:
3 arguments
Argument 1: foo
Argument 2: bar
Argument 3: baz
وهذا الحل فشل:
to run argv
do shell script "echo " & (count argv) & " arguments > /tmp/foo.txt"
repeat with i from 1 to (count argv)
do shell script "echo 'Argument " & i & ": " & (item i of argv) & "' >> /tmp/foo.txt"
end repeat
do shell script "cat /tmp/foo.txt"
do shell script "rm /tmp/foo.txt"
end run
وحتى الآن، يتم إرجاع فقط السطر الأخير. قد تكون متعلقة هذا إلى السؤال التالي من TN2065 :
<اقتباس فقرة>س: بلادي النصي تنتج الانتاج على مدى فترة زمنية طويلة. كيف يمكنني قراءة النتائج لأنها تأتي في؟
وA: مرة أخرى، والجواب القصير هو أنك لا - هل سوف شيل لن يعود حتى يتم الأمر. من حيث يونكس، فإنه لا يمكن أن تستخدم لإنشاء أنبوب. ما يمكنك القيام به، ومع ذلك، هو وضع الأمر في الخلفية (راجع السؤال التالي)، وإرسال انتاجها إلى ملف، ومن ثم قراءة الملف كما تمتلئ.
اقتباس فقرة>للأسف، وأنا لم يكن لديك ما يكفي من ابليسكريبت فو لمعرفة كيفية الحصول على ابليسكريبت نفسه قراءة خطوط متعددة، والتي أظن أن العمل.