Проблема NSTask с командой 'cat' - PullRequest
1 голос
/ 23 декабря 2010

Я пытаюсь объединить файлы с помощью команды cat. Когда я использую это в терминале, все работает нормально:

cat /Users/Home/Desktop/test.mp3* > test.mp3

Попытка воспроизвести это с помощью NSTask выдает ошибку ниже:

Код:

NSArray *Args = [NSArray arrayWithObjects:[NSString stringWithFormat:@"%@*",[TAFileName stringByDeletingPathExtension]],@">",[TAFileName stringByDeletingPathExtension],nil];
NSLog(@"%@",Args);
NSString *LaunchPath = [[NSBundle mainBundle] pathForResource:@"cat" ofType:@""];
[self startTaskWithLaunchPath:LaunchPath andArguments:Args showingProcess:NO];

Вывод NSLog:

(
"/Users/Home/Desktop/test.mp3*",
">",
"/Users/Home/Desktop/test.mp3"
)

Ошибка:

cat: /Users/Home/Desktop/test.mp3*: No such file or directory
cat: >: No such file or directory
cat: /Users/Home/Desktop/test.mp3: No such file or directory

startTaskWithLaunchPath: andArguments: ShowingProcess: "отлично работает с множеством других команд терминала, я уверен на 100%, что это не проблема.

Ответы [ 2 ]

1 голос
/ 23 декабря 2010

Проблема заключается в перенаправлении ввода и глобализации, который обрабатывается оболочкой (обычно #! / Bin / bash), а не командой cat.Поэтому запуск задачи с аргументом для расширения «test.mp3 *» в реальное имя MP3 и последующего перенаправления его в другое место - это не то, что может сделать задача.

Я бы порекомендовал посмотреть, можете лиВызовите сценарий оболочки напрямую, возможно, даже динамически создайте его в своем приложении, а затем вызовите его в качестве аргумента приложения bash.Тогда он должен делать то, что вам нужно.

0 голосов
/ 28 декабря 2010

Мне удалось решить проблему с помощью "/ bin / sh".Это разбирает команду в оболочку и запускает ее так.При использовании этого метода все еще выводилось «Нет такого файла», но я решил это, изменив исходный рабочий каталог задачи.

Код для запуска задачи:

NSArray *Args = [NSArray arrayWithObjects:@"-c",[NSString stringWithFormat:@"cat %@.* >> %@",[[TAFileName lastPathComponent] stringByDeletingPathExtension],[[TAFileName lastPathComponent] stringByDeletingPathExtension]],nil];
NSString *LaunchPath = @"/bin/sh";
[self startTaskWithLaunchPath:LaunchPath andArguments:Args showingProcess:NO];

Код для изменения каталога:

[TATask setCurrentDirectoryPath:[NSString stringWithFormat:@"%@/",[TAFileName stringByDeletingLastPathComponent]]];

Все решеноСпасибо, Майкл, за помощь.

...