Как 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 ответа:
Я знаю ,что "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 тоже.