谷歌建议
echo "input" | osascript filename.scpt
和filename.scpt
set stdin to do shell script "cat"
display dialog stdin
但是,我只能得到空白对话框:它没有文本。如何从 AppleScript 的版本中获取标准输入?
我的操作系统版本是 OSX 10.8 Mountain Lion。
谷歌建议
echo "input" | osascript filename.scpt
和filename.scpt
set stdin to do shell script "cat"
display dialog stdin
但是,我只能得到空白对话框:它没有文本。如何从 AppleScript 的版本中获取标准输入?
我的操作系统版本是 OSX 10.8 Mountain Lion。
根据这个线程,从 10.8 开始,AppleScript 现在积极关闭标准输入。通过将其滑到未使用的文件描述符,它可以被保存。这是在 bash 中执行此操作的示例。
在这里,我们再次使用cat
从 magic 读取的子进程来处理它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
我知道“将标准输入设置为执行 shell 脚本“cat””曾经有效。我无法让它在 10.8 中工作,而且我不确定它什么时候停止工作。无论如何,您基本上需要将 echo 命令输出放入一个变量中,然后该变量可以用作 osascript 命令中的参数。您的 applescript 也需要处理参数(在运行 argv 上)。最后,当您使用 osascript 时,您必须告诉应用程序“显示对话框”,否则会出错。
综上所述,这里有一个处理参数的简单applescript。将此作为 filename.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
这是要运行的shell命令...
var=$(echo "sending some text to an applescript"); osascript ~/Desktop/filename.scpt "$var"
我希望这会有所帮助。祝你好运。
迟到了,但最初的 AppleScript 似乎试图做一些 osascript 不允许的事情。
如果在原始 filename.scpt 这一行:
display dialog stdin
改为:
tell application "System Events" to display dialog stdin
然后通过标准输入(而不是命令行参数)传递一个值肯定仍然适用于 10.7.5 Lion,也许 10.8 Mountain Lion 也是如此。