4

谷歌建议

echo "input" | osascript filename.scpt

filename.scpt

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

但是,我只能得到空白对话框:它没有文本。如何从 AppleScript 的版本中获取标准输入?

我的操作系统版本是 OSX 10.8 Mountain Lion。

4

4 回答 4

6

根据这个线程,从 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
$
于 2013-09-11T04:39:16.050 回答
6

抱歉,没有足够的声誉来评论答案,但我认为这里有一些重要的事情值得指出......

@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
于 2014-07-28T16:15:47.533 回答
4

我知道“将标准输入设置为执行 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"

我希望这会有所帮助。祝你好运。

于 2012-12-20T15:48:56.187 回答
0

迟到了,但最初的 AppleScript 似乎试图做一些 osascript 不允许的事情。

如果在原始 filename.scpt 这一行:

display dialog stdin

改为:

tell application "System Events" to display dialog stdin

然后通过标准输入(而不是命令行参数)传递一个值肯定仍然适用于 10.7.5 Lion,也许 10.8 Mountain Lion 也是如此。

于 2013-02-14T19:28:46.470 回答