NSTask вызывает perl, а конвейер в поиске не работает

Я пытаюсь запустить perl regex one liner для группы файлов в каталоге (через рекурсивный поиск), и у меня возникли проблемы с тем, чтобы заставить NSTask делать то, что делает одна строка в командной строке.

Perl one liner в терминале работает, и упрощенный NSTask, запускающий команду в виде строки через оболочку, тоже работает.

Команда Perl (работает)

perl -p -i -e 's/DEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";/DEBUG_INFORMATION_FORMAT = \"dwarf\";/g' `find . -name *.pbxproj`

Простой NSTask (работает)

Используя ответ Inket на другой вопрос:

NSString *command = @"perl -p -i -e 's/DEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";/DEBUG_INFORMATION_FORMAT = \"dwarf\";/g' `find /Users/nflacco/Projects/XXX/XXX.xcodeproj -name *.pbxproj`";

NSTask* task = [[NSTask alloc] init];
[task setLaunchPath: @"/bin/sh"];
[task setArguments:@[@"-c", command]];
[task launch];

Приложение терминала Xcode (не работает)

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        NSString *workspacePath = @"/Users/nflacco/Projects/XXX/XXX.xcodeproj";

        NSString *old = @"DEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";";
        NSString *new = @"DEBUG_INFORMATION_FORMAT = \"dwarf\";";

        NSTask *task = [[NSTask alloc] init];
        [task setLaunchPath:@"/usr/bin/perl"];
        NSString *regex = [NSString stringWithFormat:@"'s/%@/%@/g'", old, new];
        NSString *pathArg = [NSString stringWithFormat:@"`find %@ -name *.pbxproj`", workspacePath];
        [task setArguments:@[ @"-p", @"-i", @"-e", regex, pathArg]];
        [task launch];

    }
    return 0;
}

Консоль Xcode:

Can't open `find /Users/nflacco/Projects/XXX/XXX.xcodeproj -name *.pbxproj`: No such file or directory.
Program ended with exit code: 0

person nflacco    schedule 16.07.2014    source источник


Ответы (1)


Вы должны вызвать /bin/sh в соответствии с вашим первым примером кода. Это связано с использованием `, которое является выражением оболочки для выполнения подоболочки и отображения ее вывода.

Поэтому:

NSString *workspacePath = @"/Users/nflacco/Projects/XXX/XXX.xcodeproj";

NSString *old = @"DEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";";
NSString *new = @"DEBUG_INFORMATION_FORMAT = \"dwarf\";";

NSTask *task = [[NSTask alloc] init];
[task setLaunchPath:@"/bin/sh"];
NSString *regex = [NSString stringWithFormat:@"'s/%@/%@/g'", old, new];
NSString *pathArg = [NSString stringWithFormat:@"`find %@ -name *.pbxproj`", workspacePath];
[task setArguments:@[ @"/usr/bin/perl", @"-p", @"-i", @"-e", regex, pathArg]];
[task launch];

Еще лучше сделать всю эту работу внутри вашего приложения...

person trojanfoe    schedule 16.07.2014
comment
Я пишу плагин для переключения различных настроек проекта Xcode (изменение настроек может привести к улучшению времени сборки на 60%). В противном случае я бы просто проверил скрипт в репозитории проекта. - person nflacco; 16.07.2014