在Swift中运行shell命令

时间:2015-08-26 23:33:43

标签: macos bash swift shell

我正在尝试在我的OSX应用程序中使用Swift运行shell命令。

运行echo之类的基本命令可以正常工作,但是后面会抛出

“env:node:没有这样的文件或目录”

@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
}

运行系统命令时,我也会收到“sh:node:command not found”。

system("node -v")

更新

不如下面的一些建议那么好,但我设法将命令回显到文件中并在终端中打开并执行:

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

4 个答案:

答案 0 :(得分:4)

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")我觉得更方便:

答案 1 :(得分:3)

再看一下。

nodejs安装程序使用/usr/local/binPATH中未包含从Finder启动的应用程序:

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

该目录包含在PATH bash/etc/profile/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin & path_helper

/usr/local/bin/node

选项:

  • 只需撰写node代替PATH

  • 通过NSTask属性调整environment使用的PATH

  • 使用setenv更改system的{​​{1}} - 也会影响NSTask

  • 执行bash作为登录shell。有关详细信息,请参阅man page

答案 2 :(得分:1)

  

" sh:node:command not found"

显然,node不是绝对的路径。

听起来您已对~/.bash_profile或其他文件进行了更改,以便在node environment variable中包含PATH的位置。

system正在使用bash启动sh -c

我忘记了规则的确切含义,但bash在执行这种方式时至少会忽略一些配置文件。据推测,您对PATH的更改未被阅读或应用。

  

" env:node:没有这样的文件或目录"

同样,node不是绝对路径。 NSTask没有使用shell,因此您执行的任何进程都将继承您的应用程序的环境变量。在大多数情况下,这意味着默认PATH

如果您需要NSTask的自定义环境,请从environment抓取NSProcessInfo词典,进行更改&然后设置NSTask' environment属性。

答案 3 :(得分:0)

使用swift-commands

import Commands

Commands.Bash.run("node -v")