2017-01-07 8 views
0

Я пытаюсь запустить команды терминала из моего быстрого приложения mac, я хочу, чтобы пользователи вводили любую команду, как в терминале, без указания реального пути. Есть ли способ запустить команду и заставить ее искать каждый путь, указанный в переменной $ PATH?

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

let path = "/usr/bin/killall" 
    let arguments = ["Dock"] 
    let task = Process.launchedProcess(launchPath: path, arguments: arguments) 
    task.waitUntilExit() 

В будущем я хотел бы прочитать .sh файлы и запускать каждую строку в нем, поэтому для длинных скриптов не все двоичные файлы будут в пути по умолчанию.

Спасибо!

ответ

3

Вы можете выполнить команду с помощью env:

env utility argument ... 

Пример:

let path = "/usr/bin/env" 
let arguments = ["ls", "-l", "/"] 
let task = Process.launchedProcess(launchPath: path, arguments: arguments) 
task.waitUntilExit() 

env находит данную утилиту, используя переменную $PATH и затем выполняет его с заданными аргументами. Он имеет дополнительные параметры , чтобы указать другой путь поиска и дополнительные переменные окружения .

(Это не особенность Swift но MacOS и многих других операционных систем.)

При запуске из Finder (дважды щелкните) PATH может отличаться от PATH в среде оболочки. При необходимости, вы можете добавить дополнительные каталоги :

var env = task.environment ?? [:] 
if let path = env["PATH"] { 
    env["PATH"] = "/usr/local/bin:" + path 
} else { 
    env["PATH"] = "/usr/local/bin" 
} 
task.environment = env 

excelp и друзья также найти исполняемый файл, используя $PATH, но предлагают только «сырой» интерфейс C.

+0

hmm, похоже, не работает для cowsay & fortune: s, output: env: cowsay: Нет такого файла или каталога –

+0

@ Steven.B: Что такое «cowsay» и где он находится? –

+0

Кажется, что это в/usr/local/bin/cowsay, это мой вывод, если я повторяю мои $ PATH =>/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin. первый путь должен содержать двоичный файл: s –