2011-12-19 9 views
5

コマンドラインからコマンドを実行し、出力を表示する小さなMacRubyステータスバーアプリケーションを作成しようとしています。私はこれをする方法を知らない。私はどのように私のMacアプリケーションからこれを行うことができますか?Mac/MacRubyアプリケーションからシェルコマンドを実行するには?

更新:他にも、管理者パスワードを尋ねる必要があります。コマンドラインからこのスクリプトを実行すると、パスワードを尋ねることがあります。パスワードの入力を求めるプロンプトが表示されたり、直接入力できるようにシェルを埋め込む方法がわかりません。

+0

あなたのスクリプトは正確に何をしていますか? – SeanNieuwoudt

+0

最終的には、[vagrant](http://vagrantup.com)のGUIラッパーになります。ですから、私は ''迷惑な人 'を実行し、出力を見る必要があります。 – Andrew

答えて

6

CocoaとMacRubyを使用すると、NSTaskを使用します。 -la LSを実行し、出力を出力します例:

残念ながら
framework 'Cocoa' 

task = NSTask.alloc.init 
task.setLaunchPath("/bin/ls") 

arguments = NSArray.arrayWithObjects("-l", "-a", nil) 
task.setArguments(arguments) 

pipe = NSPipe.pipe 
task.setStandardOutput(pipe) 

file = pipe.fileHandleForReading 

task.launch 

data = file.readDataToEndOfFile 

string = NSString.alloc.initWithData(data, encoding: NSUTF8StringEncoding) 
puts "Command returned: " 
puts string 

、管理者権限などは特に、MacRubyのを使用して、簡単な作業ではありません。 SecurityFoundationフレームワークを見てください。これはlinkです。本質的には、

AuthorizationExecuteWithPrivileges(...) 

と、実行するツールのパス、フラグ、引数を設定して呼び出す必要があります。有用な例here(ObjC)があり、これがどのように動作するかを示しています。

+0

答えが更新されました。 – jtomschroeder

+0

ありがとう!それは助けて!私が知ることから、これは終了するまでブロックされます。非同期にコマンドを実行し、各行が出力されるたびにUIを更新する方法はありますか? – Andrew

+0

非同期に更新するには、_readInBackgroundAndNotify_を使用するか、別のスレッドでStandardOutputを監視します。 – jtomschroeder

1

あなたは、単にバッククォートを使用することができます。

output = `cd ~ && ls` 
puts output # or assign to a label, textbox etc. 

あなたのコマンドを実行するために管理者権限を必要とする場合、それはすべてのコマンドを実行しないであろうし、応答を返しません。

+0

それはうまくいくように見えますが、ユーザーにパスワードの入力を求める解決策が必要です。スクリプトの途中でコマンドラインから実行すると、管理者権限が必要な操作が行われるため、パスワードの入力を求められます。 – Andrew

+0

macruby_main()の直前に、目的の-c main()メソッド内の保護されたシステムファイルを読み込もうとします。それは許可を強制するでしょう。 – SeanNieuwoudt

関連する問題