我正在尝试在我的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")
答案 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/bin
,PATH
中未包含从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
选项:
答案 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)
import Commands
Commands.Bash.run("node -v")