osascript
. I've given an example of this approach before.However, there is something that I've never really been clear on. How does the AppleScript portion of the shell script read from
stdin
? Standard I/O is fundamental to Unix programming, so it is essential that AppleScript be able to access stdin
. Searching with Google hasn't enlightened me. There seems to be no useful parallel with stdout
, which works as you'd hope, with osascript
writing transparently to it.After a bit of thinking, I came up with this:
#!/bin/sh
STANDIN=$(mktemp /tmp/seereport.XXXXXXXXXXXX) || exit 1
cat > $STANDIN
/usr/bin/osascript > /dev/null <<ASCPT
set stdinText to do shell script "cat $STANDIN"
tell application "TextEdit"
activate
make new document with properties {text:stdinText}
end tell
ASCPT
trap 'rm -f $STANDIN' EXIT
STANDIN=$(mktemp /tmp/seereport.XXXXXXXXXXXX) || exit 1
cat > $STANDIN
/usr/bin/osascript > /dev/null <<ASCPT
set stdinText to do shell script "cat $STANDIN"
tell application "TextEdit"
activate
make new document with properties {text:stdinText}
end tell
ASCPT
trap 'rm -f $STANDIN' EXIT
I write
stdin
to a temporary file using cat
, then read it back out in the AppleScript portion, again using cat
. As an example, I just open a new TextEdit document with the text from stdin
as its contents. Saving this as
minimal.sh
, I can then create a new TextEdit document from the shell with: echo hello world | ./minimal.sh
This works, so I've managed to get at
stdin
. It seems pretty roundabout though. Is there a better or recommended approach?Update: I suppose it is worth mentioning that one could use
pbcopy
and pbpaste
to avoid using the temporary file. However, doing so modifies the clipboard, so I prefer the approach shown. Further, it would be possible to read the temp file using AppleScript commands, instead of calling
cat
with do shell script
. That's too fiddly for a minimal example. Beyond that, I don't see much point to it, since I'd do any processing in the shell, just using AppleScript to pass the text to an application. I can't think of any applications where a stream approach would buy us anything. Update: Modified example of using
minimal.sh
to actually use minimal.sh
!
2 comments:
here's a simple alternative to read from stdin :D
#!/bin/sh
# Converts all lowercase text from
# stdin to uppercase
#
tr '[:lower:]' '[:upper:]' < /dev/stdin
# edward
# ebaddouh@gmail.com
Thanks for the reminder on /dev/stdin. See also the next post.
Post a Comment