
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
No.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ではこの方法はだめなのかなあ。
わざわざ試してくださったんですね。
ありがとうございます。
やはりダメみたいですね。
cocoa-Application(Objective c)の方でも
名前付きpipeやpopenはコマンドが終わってからの出力でしたが、
今回の目的の為のクラスが用意されており、こちらではうまくいきました。
ちょっと古いですが一応、http://developer.apple.com/library/mac/#sampleco …
NSTextView::insertTextの方は、Applescript内での記述方法が分かりませんでしたが、
こちらも、Objective cの方ではうまくいきました。
いろいろと楽しく勉強させてもらいました。
ありがとうございました。
No.2
- 回答日時:
No.1の訂正です。
>同時に実行するもう一つのプロセスで一行ずつ(あるいは一文字ずつ)読み込んで順次表示すればできるはずです。
このプロセスはAppleScriptでやるところですね。ファイル(mkfifoで作ったもの)を開いて普通に1行ずつ読みんでその都度表示すればできます。rsyncの出力が終わればeofを返すはずですので、普通のファイルと同じ扱いで同期してくれます。
回答ありがとうございます。
名前付き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")
としても、うまくいきませんでしたが、
もう少し勉強してみます。
No.1
- 回答日時:
まず最初質問ですが、パイプを使えばできるはずです。
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を主に使っているので、少し勘違いしているところも有るかもしれませんがご参考に
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの問題です。至急教えてください。 /***から***/の部分をプログラミングにしてほし 1 2022/10/13 11:48
- その他(プログラミング・Web制作) Linuxについて質問です。 引数に指定されたアクセスログのファイルからアクセス数が多い順に上位3つ 1 2023/02/03 03:46
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
- CAD・DTP Autocad Scriptファイルからの入力とコマンドラインからの入力が違う 1 2023/08/01 09:13
- その他(プログラミング・Web制作) プログラミング pythonの問題について 2 2022/04/19 00:41
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- Excel(エクセル) VBAで、㉑という数値が、正しく、入力できない 2 2022/07/26 20:22
- その他(プログラミング・Web制作) Pythonを用いたフラッシュ暗算ソフトの開発に必要なもの 2 2023/01/29 02:22
- PostgreSQL postgreSQLをbashで実行する際に「MORE」表示をなくす方法 1 2023/05/08 21:42
- HTML・CSS ボタンをクリックした時に、入力フォームのすぐ下部に、「入力欄が空白です」というテキストメッセージが表 1 2022/04/27 16:25
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
waitやwaitpid、wait3など子プ...
-
PSコマンド
-
Windows系OSとUNIX系OSの違いに...
-
不要なスタートアップやサービ...
-
TOPコマンドで表示するCPU使用...
-
プロセス数を減らしたい
-
Idle Processなど
-
左下の広告が消えません。
-
OS内のアプリケーションファイ...
-
ファイルを一旦閉じて再度開く
-
フォルダオプュションの設定
-
PIDではなくプロセス名を指定し...
-
私はゾンビ?
-
システム構成ユーティリティに...
-
さくらインターネットのレンタ...
-
UNIX(Linuxでも)のkillコマン...
-
メモリの空き領域
-
起動しているアプリケーション...
-
プロセス
-
PCの不具合
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
TOPコマンドで表示するCPU使用...
-
プロセス、サービス、デーモン...
-
タスクマネージャのCPU率がおか...
-
タスクバーの音量アイコンをク...
-
System Idle Processってなに?...
-
アクロバットを終了しても、プ...
-
タスクマネージャに表示されな...
-
linuxでプロセスが動いているCP...
-
ネットワーク使用率約75%維持状...
-
プロンプトが返らない
-
イラストレータでの透明部分の...
-
プロセスの終了について教えて...
-
プロセスがタスクマネージャー...
-
CPU使用率が常に50~10...
-
Windowsで作れるスレッド最大数...
-
強制終了できないプロセスの強...
-
Windowsで同時にオープンできる...
-
デーモンモードとは何でしょうか?
-
cpuの使用率が50%以上常にあ...
-
メディアプレイヤーが終了でき...
おすすめ情報