Как AppleScript может получить STDIN внутри кода?


Google предлагает

echo "input" | osascript filename.scpt

С filename.scpt

set stdin to do shell script "cat"
display dialog stdin

Однако я смог получить только пустой диалог: в нем нет текста. Как я могу получить stdin от AppleScript в версии?

Моя версия ОС-OSX 10.8 Mountain Lion.

4 4

4 ответа:

Я знаю ,что "set stdin to do shell script" cat "" раньше работал. Я не могу заставить его работать в 10.8, хотя и не уверен, когда он перестал работать. В любом случае, вам в основном нужно получить вывод команды echo в переменную, которая затем может быть использована в качестве аргумента в команде osascript. Ваш applescript также должен обрабатывать аргументы (при запуске argv). И, наконец, когда вы используете osascript, вы должны сказать приложению, чтобы оно "отображало диалог", иначе оно будет ошибаться.

Итак, со всем сказанным вот простой applescript, который обрабатывает аргументы. Сделайте это кодом имени файла.scpt.

on run argv
    repeat with i from 1 to count of argv
        tell application "Finder"
            activate
            display dialog (item i of argv)
        end tell
    end repeat
end run

Вот команда оболочки для запуска...

var=$(echo "sending some text to an applescript"); osascript ~/Desktop/filename.scpt "$var"

Надеюсь, это поможет. Удачи.

Согласно этому потоку, начиная с 10.8 AppleScript теперь агрессивно закрывает стандарт. Сдвинув его с пути к неиспользуемому файловому дескриптору, его можно сохранить. Вот пример того, как это делается в bash.

Здесь мы снова подходим к этому с помощью подпроцесса cat, считывающего из магии fd.

$ echo world | osascript 3<&0 <<'APPLESCRIPT'
>   on run argv
>     set stdin to do shell script "cat 0<&3"
>     return "hello, " & stdin
>   end run
> APPLESCRIPT
hello, world
$

Извините, недостаточно репутации, чтобы комментировать ответы, но я думаю, что здесь есть что-то важное, на что стоит обратить внимание...

Решение в ответе @regulus6633 является нет то же самое, что и передача данных в osascript. Это просто заполнение всего содержимого канала (в данном случае, вывода echo) в переменную и передача ее в osascript в качестве аргумента командной строки.

Это решение может работать не так, как ожидалось, в зависимости от того, что находится в вашей трубе (возможно ваша оболочка тоже играет свою роль?)... например, если там есть символы null (\0):

$ var=$(echo -en 'ABC\0DEF')

Теперь вы можете подумать, что var содержит строки " ABC "и" DEF", разделенные символом null, но это не так. ]}

$ echo -n "$var" | wc -c
    6

Однако, используя ответ @phs (истинная труба), вы получите свой ноль:

$ echo -en 'ABC\0DEF' | osascript 3<&0 <<EOF
>   on run argv
>     return length of (do shell script "cat 0<&3")
>   end run
>EOF
7
Но это всего лишь использование нулей. Попробуйте передать некоторые случайные двоичные данные в osascript в качестве аргумента командной строки:
$ var=$(head -c8 /dev/random)
$ osascript - "$var" <<EOF
>   on run argv
>     return length of (item 1 of argv)
>   end run
>EOF
execution error: Can’t make some data into the expected type. (-1700)

Один раз опять же, ответ @phs прекрасно справится с этим:

$ head -c8 /dev/random | osascript 3<&0 <<EOF
>  on run argv
>    return length of (do shell script "cat 0<&3")
>  end run
>EOF
8

Поздно к этому, но оригинальный AppleScript, кажется, пытается сделать что-то не разрешенное с osascript.

Если в исходном имени файла.scpt эта строка:

display dialog stdin

Изменяется на:

tell application "System Events" to display dialog stdin

Тогда передача значения через stdin (в отличие от аргументов командной строки) определенно все еще работает в 10.7.5 Lion, возможно, 10.8 Mountain Lion тоже.