باستخدام APPLECTECTECTECTECTECTOMATION لتسليم أسماء الملفات إلى برنامج نصي شل

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

  •  13-09-2019
  •  | 
  •  

سؤال

لدي برنامج نصي لأجهزة السيارات التي أرغب في تشغيلها في مجلد. أريد أن يأخذ البرنامج النصي لكل ملف في المجلد وتشغيل أمر Shell My Shell عليه. تم تعيين Automator لتمرير المدخلات إلى Stdin، لكنني لا أعتقد أنني أستخدم Stdin بشكل صحيح أدناه، هل يمكنك المساعدة من فضلك؟

for f in "$@" 
do
    java -Xmx1000m -jar /Users/myprog/myprog.jar $f 
done
هل كانت مفيدة؟

المحلول

المتغير الخاص $@ يمثل جميع وسيطات سطر الأوامر المقدمة إلى البرنامج النصي.

ال for حلقة خطوات من خلال كل واحد وتنفذ ملف جرة في كل مرة. يمكنك تقصير البرنامج النصي إلى:

for f
do
    java -Xmx1000m -jar /Users/myprog/myprog.jar "$f"
done

منذ السلوك الافتراضي لل for هو للاستخدام $@.

يجب عليك وضع اقتباسات حول $ F في نهاية الأمر Java في حالة وجود مسافات في الحجج.

نصائح أخرى

أنت صحيح عندما تقول أنك "لا تستخدم Stdin بشكل صحيح". في الواقع، من مقتطف البرنامج النصي الذي قدمته، يفترض البرنامج النصي الخاص بك أنك تحصل على الملفات كوسيلة على سطر الأوامر ... أنت لا تستخدم Stdin على الإطلاق!

في الركن الأيمن العلوي من عمل البرنامج النصي Shell Run، أسفل X هو مربع منسدلة مع 2 خيارات: "إدخال الإدخال: إلى Stdin" و "تمرير": كحجج ". هذه الخيارات تملي كيف يتم تمرير الملفات المحددة إلى عمل البرنامج النصي الخاص بك. إذا تم تحديد خيار "الحجج"، فيجب استخدام البرنامج النصي الخاص بك القالب التالي

for f in "$@"; do
# so stuff here
done

يتم توفير هذا القالب من خلال الإجراء نفسه عندما يتم تحديد "كما الحجج".

من ناحية أخرى، إذا تم تحديد خيار "TON StDin"، فيجب استخدام البرنامج النصي هذا Tamplate:

while read fname; do  # read each line - assumes one file name per line
   # do clever stuff with the filename
   echo $fname # to illustrate we'll simply copy the filename to stdout
done

(في حال كنت لا تعرف البرمجة النصية باش، كل شيء بعد # على خط هو تعليق)

لاحظ أن القالب الذي يوفره إجراء البرنامج النصي هو أمر بسيط

cat

ليس مفيدا جدا في رأيي.

لاحظ أنه حتى تقوم بالفعل بإدخال نص في منطقة البرنامج النصي، فإن التغيير بين "إلى Stdin" و "كحجج" سيؤدي إلى تغيير محتويات مربع البرنامج النصي (أفترض أن هذا هو تلميح إلى ما يجب أن يشبه البرنامج النصي الخاص بك) ولكن بمجرد إدخال شيء ما ، التبديل لم يعد يحدث.

بناء على ما رأيته هنا، يمكنك إعداد "خدمة" مفيد يتيح لك النقر بزر الماوس الأيمن وتحويل الملفات باستخدام القائمة السياقية في الباحث.

لتعيين هذا الأمر:

  • إطلاق الآلي
  • من القائمة الرئيسية، اختر "جديد"
  • حدد "الخدمة" (أيقونة التروس)
  • اسحب وإسقاط "الأدوات المساعدة -> تشغيل البرنامج النصي Shell" من مكتبة اليد اليسرى إلى منطقة "المحرر" الرئيسية.
  • استبدال النص الحالي "CAT" مع التعليمات البرمجية التالية:

    for f in "$@"; do
        /usr/bin/afconvert -f caff -d LEI16@32000 -c 1 --mix "$f"
        echo "$f converted"
    done
    

    ملاحظة: سيتم تحويل الإعداد أعلاه إلى Mono (-C 1 --MIX) في 16 بت @ 32000 هرتز (LEI16 @ 32000 = Nittle Endian 16 بت). استخدم / USR / BIN / AFCONVERT -H في محطة لرؤية جميع الخيارات المتاحة.

  • في الجزء العلوي من المحرر، يجب أن ترى اثنين من الانخفاضات، ووضعها على النحو التالي:

    Service receives selected [Files and Folders] in [Finder.app]
    
  • في منطقة محرر SHELT Script، تأكد من:

    "Shell" is set to "/bin/bash"
    

    و

    "pass input" is set to "arguments" 
    
  • احفظ شيء مثل "تحويل إلى CAF"

  • انتقل إلى مجلد مع بعض Wavs هناك.
  • انقر بزر الماوس الأيمن فوق WAV ويجب أن ترى "تحويل إلى CAF" في أسفل القائمة السياقية.

لست متأكدا من أنني أفهم سؤالك لأن البرنامج النصي الخاص بك لا يبدو أنه يستخدم Stdin. ال $ @ المعلمة الخاصة يتوسع إلى المعلمات الموضعية التي مرت كحجج في Argv. إنه يعمل بنفس الطريقة كما لو كنت تسمى البرنامج النصي مباشرة من Shell بهذه الطريقة:

$ cat >test
for f in "$@"
do
  echo $f
done
$ chmod 755 test
$ ./test a b c
a
b
c

إذا كنت ترغب في الحصول على الحجج من Stdin، أنت يستطع افعل شيئا مثل هذا:

$ cat >test2
for f in $(cat)
do
  echo $f
done
$ chmod 755 test2
$ ./test2 <<EOF
> a b c
> EOF
a
b
c
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top