Использование Apple Automator для передачи имен файлов в сценарий командной строки

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

  •  13-09-2019
  •  | 
  •  

Вопрос

У меня есть скрипт automator, который я хотел бы запустить в папке.Я хочу, чтобы скрипт брал каждый файл в папке и запускал над ним мою команду командной строки.Automator настроен на передачу входных данных в stdin, но я не думаю, что я правильно использую stdin ниже, не могли бы вы помочь, пожалуйста?

for f in "$@" 
do
    java -Xmx1000m -jar /Users/myprog/myprog.jar $f 
done
Это было полезно?

Решение

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

В for цикл выполняет шаги по каждому из них и каждый раз запускает jar-файл.Вы могли бы сократить сценарий до:

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

поскольку поведение по умолчанию for заключается в использовании $@.

Вы должны заключить в кавычки $f в конце java-команды на случай, если в аргументах есть пробелы.

Другие советы

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

В правом верхнем углу действия Запустить сценарий командной строки под Крестиком находится выпадающий список с 2 вариантами:'Передать ввод:в stdin' и 'Передать intput:в качестве аргументов".Эти параметры определяют, как выбранные файлы будут переданы в действие вашего скрипта.Если выбран параметр "в качестве аргументов", ваш скрипт должен использовать следующий шаблон

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

Этот шаблон предоставляется самим действием, когда выбрано 'в качестве аргументов'.

С другой стороны, если выбран параметр 'to 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

На мой взгляд, не очень полезно.

Обратите внимание, что до тех пор, пока вы на самом деле не введете текст в область скрипта, переключение между 'to stdin' и 'as arguments' изменит содержимое поля скрипта (я предполагаю, что это подсказка к тому, как должен выглядеть ваш скрипт), но как только вы что-то вводите, переключение больше не происходит.

Основываясь на том, что я видел здесь, вы можете настроить удобный "сервис", который позволяет вам щелкать правой кнопкой мыши и конвертировать файлы с помощью контекстного меню в finder.

Чтобы настроить это:

  • Автоматический запуск
  • В главном меню выберите "Создать".
  • Выберите "Сервис" (значок шестеренки).
  • Перетащите "Утилиты -> Запустить сценарий командной строки" из левой библиотеки в главную область "редактор".
  • Замените существующий текст "cat" следующим кодом:

    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 Гц (LEI16 при частоте 32000 = 16 бит младшего порядка).Используйте /usr/bin/afconvert -h в терминале, чтобы просмотреть все доступные опции.

  • В верхней части редактора вы должны увидеть два выпадающих списка, задайте их следующим образом:

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

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

    и

    "pass input" is set to "arguments" 
    
  • Сохраните это что-то вроде "Преобразовать в CAF".

  • Перейдите к папке с несколькими файлами WAV там.
  • Щелкните правой кнопкой мыши на WAV, и вы должны увидеть "Конвертировать в CAF" в нижней части контекстного меню.

Я не уверен, что понимаю ваш вопрос, поскольку ваш скрипт, похоже, не использует 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top