2015-08-26 4 views
3

Я пытаюсь запустить команды оболочки с помощью Swift в моем приложении OSX.Выполнение команд оболочки в Swift

Бег основные команды, такие как эхо работают хорошо, но следующие броски

«ENV: узел: Нет такого файла или каталога»

@IBAction func streamTorrent(sender: AnyObject) { 
    shell("node", "-v") 
} 

func shell(args: String...) -> Int32 { 
    let task = NSTask() 
    task.launchPath = "/usr/bin/env" 
    task.arguments = args 
    task.launch() 
    task.waitUntilExit() 
    return task.terminationStatus 
} 

Я также получаю «ш: узел: команда не найдена» при запуске системной команды.

system("node -v") 

Update:

Не так хорошо, как некоторые из приведенных ниже предложений, но мне удалось повторить команду в файл и он открыт и выполнен в терминале:

system("echo node -v > ~/installation.command; chmod +x ~/installation.command; open ~/installation.command") 
+0

У вас определенно есть командная строка Util Installed называется 'node'? Что происходит, когда вы пытаетесь «node -v» в терминале? – Barjavel

ответ

2

Посмотрел на это немного больше.

Установщик nodejs использует /usr/local/bin, который не входит в PATH для приложений, запущенных из Finder:

/usr/bin:/bin:/usr/sbin:/sbin 

каталог входит в PATH набор для bash через /etc/profile & path_helper:

/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin 

Опции:

  • Просто напишите /usr/local/bin/node вместо node.

  • Tweak the PATH Используется NSTask через environment.

  • Использование setenv изменить PATH для system - также будет влиять на NSTask.

  • Выполнение bash в качестве оболочки входа. Подробности см. На странице man page.
+0

Написание пути перед запуском команды работает достаточно просто, спасибо. –

1

"sh: node: команда не найдена"

Очевидно, node не является абсолютным путем.

Похоже, вы внесли изменения в ~/.bash_profile или другой файл, чтобы включить расположение node в PATHenvironment variable.

system запускает bash используя sh -c.

Я забыл, что такое правила, но bash будет игнорировать хотя бы некоторые файлы конфигурации при выполнении этого способа. Предположительно, ваши изменения на PATH не читаются и не применяются.

"ENV: узел: Нет такого файла или каталога"

Опять node не абсолютный путь. NSTask не использует оболочку, поэтому любые выполняемые вами процессы наследуют переменные среды вашего приложения. В большинстве случаев это означает значение по умолчанию PATH.

Если вам нужны пользовательские среды для NSTask, возьмите environment словарь из NSProcessInfo, внесите изменения & затем установите NSTask «s environment свойства.

1
func shell(command: String) -> Int32 { 
    let task = NSTask() 
    task.launchPath = "/usr/bin/env" 
    task.arguments = ["bash", "-c", command] 
    task.launch() 
    task.waitUntilExit() 
    return task.terminationStatus 
} 

Таким образом, вы можете сделать shell("node -v"), которые я нахожу более удобным:

Смежные вопросы