2

NSTask を含むメソッドに非常に奇妙な問題があります。10.7以降では、機能は完全に正常に機能し、正常に実行され、結果が返され、ファイルが目的のディレクトリにコピーされます。

私のアプリケーションを 10.6.8 で試してみると、NSTask はまったく何もしていないように見えます。問題がどこにあるかを判断するためにあらゆる角度から試してみましたが、可能性がありませんでした。:-/

NSTask *task = [[NSTask alloc] init];
[task setLaunchPath: @"/bin/sh"];

NSArray *arguments = [NSArray arrayWithObjects: @"-c",
                     @"find /Data/*.jug/files/ -name thefile | head -n 1 | awk -v dir=\"$HOME/path/to/copy/to\" '{printf \"cp \\\"%s\\\" \\\"%s\\\"\\n\", $1, dir }' | sh", nil];

[task setArguments: arguments];

NSPipe *thePipe = [NSPipe pipe];
[task setStandardInput:[NSPipe pipe]];
[task setStandardOutput:thePipe];

[task launch];
[task waitUntilExit];
[task release];

10.6.8 でターミナル経由でコマンドを試すと、アプリケーションで期待される結果が返されます。私はここで完全に途方に暮れており、誰かがこの問題とその修正方法に光を当ててくれることを本当に願っています.

4

2 に答える 2

0

この/Data/*.jug: Not a directoryエラー メッセージは通常、シェルのグロブ展開で一致するファイルがなく/Data/*.jug、既存のファイルまたはディレクトリを引数として必要とするコマンドにリテラルが渡された場合に発生します。

Bashシェルを使用すると、この種のエラーを回避できますshopt -s nullglob

さらに、グロブ展開が有効になっていることを確認する必要があります ( set +f) Bash

したがって、シェルを明示的に使用し、Bashシェル[task setLaunchPath: @"/bin/bash"];コードのテストを開始します。

@"set +f; shopt -s nullglob; ls -ld /; find /Data/*.jug/files/ -name thefile"

次に、指定されたシェルコードの各コマンドを段階的に追加してテストします。

絶対に確実にするために、完全な実行可能パスを使用することもできます/usr/bin/find

スペースを含むファイル名がある場合は、コマンドでawk置き換えます。$1$0

コンパイラの混乱の原因として考えられるのは、C スタイルのコメント start /*in/Data/*.jug/files/です。

より多くの出力情報を取得するには、可能であれば詳細モードでシェル コマンドを使用しcp -vますbash -xv -c

あなたのコードは、 NSPipe - CocoaDevをコンパイラとして使用asynctask.mして、Mac OS X 10.6.8 を搭載した私のマシンで機能しました。/usr/bin/gcc-4.2

NSTask *task = [[NSTask alloc] init];
[task setLaunchPath: @"/bin/bash"];

NSArray *arguments = [NSArray arrayWithObjects: 
   @"-xv",
   @"-c",
   @"set +f; shopt -s nullglob; ls -ld /noSuchFile; find /Data/*.jug/files/ -name thefile | head -n 1 | awk -v dir=\"$HOME/path/to/copy/to\" '{printf \"cp -v \\\"%s\\\" \\\"%s\\\"\\n\", $1, dir }' | bash -xv", nil];
于 2013-01-18T14:07:39.920 に答える
0

次のような引用符で試してください。

'/Data/*.jug/files/' 

また

 \"/Data/*.jug/files/\"
于 2013-01-02T03:52:29.950 に答える