Проблемы с NsTask для выполнения команды терминала - PullRequest
1 голос
/ 16 мая 2011

Обычно в терминале я выполняю эту команду для связи с последовательным USB-устройством.

echo -e '\ xFF \ x01 \ x01'> /dev/cu.usbserial-A8003YzT

Я пытаюсь сделать это из приложения какао, используя NStask, но по какой-то причине я не чувствую любви.

Вот мой код:

- (IBAction) doCommand:(id)sender{
{
    NSTask *task;
    task = [[NSTask alloc] init];

    [task setLaunchPath:@"/bin/echo"];

    [task setArguments:
[NSArray arrayWithObjects:@"-e '\\xFF\\x01\\x01' > /dev/cu.usbserial-A8003YzT", nil]];


    [task launch];

    [task release];
}}

Я знаюкод по существу работает, так как я выполнил другие команды терминала с тем же сценарием ..... не уверен, почему я не могу получить эхо-сигнал .... возможно, мне не хватает чего-то простого?

Спасибо за любую помощь

1 Ответ

2 голосов
/ 16 мая 2011

Вы пытаетесь отправить '\xFF\x01\x01' > /dev/cu.usbserial-A8003YzT в качестве первого аргумента echo, но это не то, что происходит, когда вы запускаете эту команду из командной строки. Только первая часть в кавычках отправляется в качестве аргумента для echo. Bash интерпретирует сам >, захватывает выходные данные команды echo и перенаправляет их в указанный файл - в данном случае это файл, представляющий USB-устройство.

Если вы хотите запустить NSTask, который будет интерпретировать команду оболочки с перенаправлениями, каналами и т. Д., Вам нужно будет использовать /bin/sh в качестве пути запуска и -c, your shell command в качестве аргументов .

Кроме того, вы можете вообще пропустить NSTask и просто открыть NSFileHandle в файле устройства, а затем отправить трехбайтовую последовательность, которую хотите отправить. Echo удобен для интерактивной отладки, подобной этой, в терминале, но запуск внешней задачи в вашем приложении, просто для записи трех байтов в файл, является довольно радикальным излишним ...: -)

...