1

.shファイルを実行してその出力を取得する必要があります。ファイルの設定も確認する必要があります。

.shファイルは、ターミナルを介してJavaアプリを実行するだけです。

何か案は?私は本当にこれに固執しています.....

エリヤ

server.shファイル:

echo Starting Jarvis Program D.
ALICE_HOME=.
SERVLET_LIB=lib/servlet.jar
ALICE_LIB=lib/aliceserver.jar
JS_LIB=lib/js.jar

# Set SQL_LIB to the location of your database driver.
SQL_LIB=lib/mysql_comp.jar

# These are for Jetty; you will want to change these if you are using a different http server.
 HTTP_SERVER_LIBS=lib/org.mortbay.jetty.jar

 PROGRAMD_CLASSPATH=$SERVLET_LIB:$ALICE_LIB:$JS_LIB:$SQL_LIB:$HTTP_SERVER_LIBS
 java -classpath $PROGRAMD_CLASSPATH -Xms64m -Xmx128m org.alicebot.server.net.AliceServer $1

私の現在のコード:

NSTask *server = [NSTask new];
[server setLaunchPath:@"/bin/sh"];
[server setArguments:[NSArray arrayWithObject:@"/applications/jarvis/brain/server.sh"]];

NSPipe *outputPipe = [NSPipe pipe];
[server setStandardInput:[NSPipe pipe]];
[server setStandardOutput:outputPipe];
[server launch];


NSMutableString *outputString = [NSMutableString string];
while ([outputString rangeOfString:@"Jarvis>"].location == NSNotFound) {
    [outputString appendString:[[[NSString alloc] initWithData:[[outputPipe fileHandleForReading] readDataToEndOfFile] encoding:NSUTF8StringEncoding] autorelease]];
    NSRunAlertPanel(@"", outputString, @"", @"", @"");

}

NSRunAlertPanelは、出力をチェックするためだけのものです。今、私のコードはフリーズしていて、アラートパネルにさえ到達していません。

4

3 に答える 3

3

この質問への回答を参照してください。

スクリプトで修正する必要があることがいくつかあります。

  • スクリプトはシバンで始まる必要があります。また、スクリプトの実行可能ビットが設定されていることを確認してください。
  • 環境変数はシェルスクリプトディレクトリを基準にして設定されるため、スクリプトディレクトリが現在のディレクトリであることを確認する必要があります。
  • Javaプロセスに表示されるはずの環境変数をエクスポートする必要があります。
  • 最後の行ではexec、シェルプロセスをJettyを実行するJava実行可能ファイルに置き換えるために使用できます。

スクリプトの改訂版は次のとおりです。

#!/bin/sh
echo Starting Jarvis Program D.
cd "`dirname \"$0\"`"
export ALICE_HOME=.
export SERVLET_LIB=lib/servlet.jar
export ALICE_LIB=lib/aliceserver.jar
export JS_LIB=lib/js.jar

# Set SQL_LIB to the location of your database driver.
export SQL_LIB=lib/mysql_comp.jar

# These are for Jetty; you will want to change these if you are using a different http server.
export HTTP_SERVER_LIBS=lib/org.mortbay.jetty.jar

export PROGRAMD_CLASSPATH=$SERVLET_LIB:$ALICE_LIB:$JS_LIB:$SQL_LIB:$HTTP_SERVER_LIBS
exec java -classpath $PROGRAMD_CLASSPATH -Xms64m -Xmx128m org.alicebot.server.net.AliceServer $1

複数の引数を使用してObjective-Cでシェルスクリプトを呼び出す:

NSTask *server = [NSTask new];
[server setLaunchPath:@"/bin/sh"];
[server setArguments:[NSArray arrayWithObjects:@"/applications/jarvis/brain/server.sh", @"argument", nil]];
...
于 2010-08-20T08:29:24.277 に答える
1

AMShellWrapperTest.appを使用すると、BannerController.mの「-(void)appendOutput:(NSString *)output」を変更することで、server.shのstdoutストリームをフィルタリング(保存、...)できます。(...しかし、これを行うためのより良い方法があるかもしれません...)

/*
// output from stdout

- modified AMShellWrapper/AMShellWrapperTest/BannerController.m (http://www.harmless.de/cocoa-code.php)
to print server.sh setup information to "Error Messages:" text output field (or Console.app as an 
alternative) and the Q & A dialog to the "Output:" text field

- use of default charliebot, http://sourceforge.net/projects/charliebot/, modified only to run server.sh
with complete path (here: ~/Desktop/charliebot/server.sh) in AMShellWrapperTest.app

*/
- (void)appendOutput:(NSString *)output
{

    NSMutableString *outputString = [NSMutableString string];

    if (
          ([output rangeOfString:@"Charlie>"].location != NSNotFound ) || \
          ([output rangeOfString:@"[Charlie] user>"].location != NSNotFound )
        ) {
    [self write: output];
    [self write: @"\n"];
        } else {
          [outputString appendString: output];
          //[outputString writeToFile:@"/dev/console" atomically: NO];  // alternative
          [errorOutlet setString:[[errorOutlet string] stringByAppendingString: outputString]];
        }
}
于 2010-08-21T21:03:19.370 に答える
0

はい、しかしなぜ私のコード(上記に投稿)が機能しないのですか?

「Jarvis>」行は、server.sh出力ストリームの最初の行であり、ユーザー入力が必要です。つまり、この行は、改行文字「\n」で終了しないと不完全です。server.shがTerminal.appで実行されていた場合、ユーザーはリターンキーを押してダイアログを続行する必要があります。whileループの条件付きコード(NSNotFound)は、この不完全な行(whileループを中止する)でジョブを終了できず、スタックします。

whileループを削除し、NSFileHandleで「readInBackgroundAndNotify」モードを使用して、非ブロッキングI /Ostdoutストリームの動作を取得する必要があります。

参照:NSTask / NSPipeSTDINが大きなデータでハングする場合があります...

したがって、必要に応じて、GUIコードを削除して、AMShellWrapperTest.appのソースコードを純粋なコマンドラインツールに変換するだけです。

于 2010-08-22T07:16:49.297 に答える