Използване на Automator на Apple за предаване на имена на файлове към скрипт на обвивка

Имам автоматизиран скрипт, който бих искал да стартирам в папка. Искам скриптът да вземе всеки файл в папката и да изпълни моята командна обвивка върху него. Automator е настроен да предава входни данни на stdin, но не мисля, че използвам правилно stdin по-долу, можете ли да помогнете, моля?

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

person John    schedule 06.12.2009    source източник


Отговори (4)


Специалната променлива $@ представлява всички аргументи на командния ред, предоставени на скрипта.

Цикълът for преминава през всеки един и всеки път изпълнява jar файла. Можете да съкратите скрипта до:

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

тъй като поведението по подразбиране на for е да използва $@.

Трябва да поставите кавички около $f в края на java командата, в случай че има интервали в аргументите.

person Dennis Williamson    schedule 07.12.2009

Вие сте прав, когато казвате, че "не използвате правилно stdin". Всъщност, от фрагмента на скрипта, който предоставихте, вашият скрипт предполага, че получавате файловете като аргументи на командния ред ... вие изобщо не използвате stdin!

В горния десен ъгъл на действието Run Shell Script, под X има падащо поле с 2 опции: „Предаване на вход: към stdin“ и „Предаване на вход: като аргументи“. Тези опции диктуват как избраните файлове се предават на действието на вашия скрипт. Ако е избрана опцията „като аргументи“, вашият скрипт трябва да използва следния шаблон

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

Този шаблон се предоставя от самото действие, когато е избрано „като аргументи“.

От друга страна, ако е избрана опцията „към stdin“, тогава вашият скрипт трябва да използва този шаблон:

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

(В случай, че не знаете bash скриптове, всичко след # на ред е коментар)

Обърнете внимание, че шаблонът, предоставен от действието на скрипта, е проста, единична команда

cat

Не е много полезно според мен.

Обърнете внимание, че докато всъщност не въведете текст в областта на скрипта, смяната между „към stdin“ и „като аргументи“ ще промени съдържанието на полето за скрипт (предполагам, че това е намек за това как трябва да изглежда вашият скрипт), но след като въведете нещо , превключването вече не се случва.

person ehzone    schedule 31.08.2012

Въз основа на това, което видях тук, можете да настроите удобна "услуга", която ви позволява да щракнете с десния бутон и да конвертирате файлове с помощта на контекстното меню във търсачката.

За да настроите това:

  • Стартирайте Automator
  • От главното меню изберете "Ново"
  • Изберете „Услуга“ (иконата на зъбно колело)
  • Плъзнете и пуснете „Помощни програми -> Изпълнение на Shell Script“ от лявата библиотека в главната област „редактор“.
  • Заменете съществуващия текст "котка" със следния код:

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

    ЗАБЕЛЕЖКА: Настройката по-горе ще се преобразува в моно (-c 1 --mix) при 16 бита @ 32000 hz (LEI16@32000 = 16 бита с малък ред). Използвайте /usr/bin/afconvert -h в терминала, за да видите всички налични опции.

  • В горната част на редактора трябва да видите две падащи менюта, задайте ги както следва:

    Service receives selected [Files and Folders] in [Finder.app]
    
  • В областта на редактора на Shell Script се уверете, че:

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

    и

    "pass input" is set to "arguments" 
    
  • Запазете нещо като "Конвертиране в CAF"

  • Отидете до папка с някои WAV файлове там.
  • Щракнете с десния бутон върху WAV и трябва да видите „Конвертиране в CAF“ в долната част на контекстното меню.
person bob    schedule 09.12.2011

Не съм сигурен, че разбирам въпроса ви, тъй като вашият скрипт изглежда не използва stdin. $@ специалният параметър се разширява до позиционните параметри предавани като аргументи в argv. Работи по същия начин, както ако извикате скрипта директно от обвивката по следния начин:

$ 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
person Ned Deily    schedule 07.12.2009