重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

xcodeを使って、mac と walkmanの音楽を同期するアプリ作ろうと思っています。
プログラムは主にシェルスクリプト(bash)で書かれており、
同期自体は rsync を使っています。
applescriptでは上記シェルスクリプトを「do shell script 」で走らせ、
その標準出力を NSTextView に表示させています。

set text to (do shell script "rsync_script.sh")
textView's setString_(text)

ただし、この方法だとrsyncが終わった時点でしか、標準出力を表示出来ません。
どうにか、シェルスクリプト実行中に標準出力を表示させていく方法はありませんでしょうか??
また、NSTextViewでは、書き込む度に前の文字が上書きされてしまいますが、
消さずに追記していく方法はありますでしょうか?
よろしくお願いします。

私の環境はこちらです。
mac os 10.6
xcode 3.26

A 回答 (3件)

こちらでも試してみましたが同じように読み込みで止まってしまい進みませんね。

(同じくOSX10.6です)

やり方が悪いのかと思ってRubyでも同じやり方を書いて実行しいましたが正常に動きました。
filename="pipe"
File.delete(filename) if File.exist?(filename)
system "mkfifo #{filename}"
system "(for i in 1 2 3 4 5 ; do echo $i; sleep 1; done) > "+filename+" 2>&1 &"
open(filename) do |fn|
while s=fn.gets
puts s
end
end
puts "EOF : Exit loop"
File.delete(filename)

ファイルを作らない方法でも問題はありませんでした。
open("|(for i in 1 2 3 4 5 ; do echo $i; sleep 1; done)") do |fn|
while s=fn.gets
puts s
end
end
puts "EOF : Exit loop"

AppleScriptではこの方法はだめなのかなあ。
    • good
    • 0
この回答へのお礼

わざわざ試してくださったんですね。
ありがとうございます。
やはりダメみたいですね。
cocoa-Application(Objective c)の方でも
名前付きpipeやpopenはコマンドが終わってからの出力でしたが、
今回の目的の為のクラスが用意されており、こちらではうまくいきました。
ちょっと古いですが一応、http://developer.apple.com/library/mac/#sampleco …

NSTextView::insertTextの方は、Applescript内での記述方法が分かりませんでしたが、
こちらも、Objective cの方ではうまくいきました。

いろいろと楽しく勉強させてもらいました。
ありがとうございました。

お礼日時:2012/06/02 12:27

No.1の訂正です。



>同時に実行するもう一つのプロセスで一行ずつ(あるいは一文字ずつ)読み込んで順次表示すればできるはずです。

このプロセスはAppleScriptでやるところですね。ファイル(mkfifoで作ったもの)を開いて普通に1行ずつ読みんでその都度表示すればできます。rsyncの出力が終わればeofを返すはずですので、普通のファイルと同じ扱いで同期してくれます。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
名前付きpipe は初めてだったので、
見よう見まねで下記のサンプルを試しましたが、
うまくいきませんでした。

set textFile to "Macintosh HD:Users:username:temp:pipe"
set ptextFile to POSIX path of textFile
do shell script ("if [ -e " & ptextFile & " ] ; then /bin/rm " & ptextFile & "; fi")

do shell script "/usr/bin/mkfifo " & ptextFile
do shell script "(for i in 1 2 3 4 5 ; do echo $i; sleep 1; done) > " & ptextFile & " 2>&1 &"

try
set fn to (open for access textFile without write permission)
on error
display dialog "Couldn't open file"
end try

repeat
try
set txt to (read fn until ASCII character (10)) as string
#before return も using delimiter returnも何故か使えず
display dialog txt
on error number errNum
if errNum = -39 then -- End of file error
display dialog "EOF : Exit loop"
exit repeat
else
display dialog "Error : Couldn't read file"
end if
end try
end repeat

close access fn
display dialog "Closed file"
do shell script ("if [ -e " & ptextFile & " ] ; then /bin/rm " & ptextFile & "; fi")


シェルコマンド(for i in ....)をバックグランドで走らせているのですが、
ここから先には進みません。
ターミナルを別途開き「cat pipe」 を実行する事で、
スタックしていた applescript は一応動き出しますが、
それでもデータは読めませんでした。

pipe をapplescript上で使う場合、
「open access for」では無い読み込み方法があるのでしょうか??


また、insertTextについても情報ありがとうございます。
まだあまり試せていませんが、
textView's insertText_("example text")
としても、うまくいきませんでしたが、
もう少し勉強してみます。

お礼日時:2012/05/30 16:02

まず最初質問ですが、パイプを使えばできるはずです。


shellスクリプトだとnamed pipeを使うのが簡単なように思います。
まずmkfifoで名前付きのパイプを作りバックグラウンドでrsyncからそれに書き込みます。
同時に実行するもう一つのプロセスで一行ずつ(あるいは一文字ずつ)読み込んで順次表示すればできるはずです。

rubyなどだと普通のパイプで可能です。この方法がshellスクリプでできるかはわかりません。
open("|rsync ?????"){|fi|
while s=fi.gets
sをNSTextViewに書き出す
end
で1行ずつ順次書き出されます。

後の質問ですが、insertTextでできるはずです。
参考
http://homepage.mac.com/mkino2/cocoaProg/AppKit/ …

最近はAppleScriptではなくruby+rubycocoaを主に使っているので、少し勘違いしているところも有るかもしれませんがご参考に
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!