Macos 在Swift中运行shell命令

Macos 在Swift中运行shell命令,macos,bash,swift,shell,Macos,Bash,Swift,Shell,我正在尝试在我的OSX应用程序中使用Swift运行shell命令 运行诸如echo之类的基本命令可以很好地工作,但是以下抛出 “env:node:没有这样的文件或目录” 在运行系统命令时,我还得到“sh:node:command not found” system("node -v") 更新: 没有下面的一些建议那么好,但我设法将命令回显到一个文件中,并在终端中打开和执行它: system("echo node -v > ~/installation.command; chmod +x

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

运行诸如echo之类的基本命令可以很好地工作,但是以下抛出

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

在运行系统命令时,我还得到“sh:node:command not found”

system("node -v")
更新:

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

system("echo node -v > ~/installation.command; chmod +x ~/installation.command; open ~/installation.command")
“sh:节点:未找到命令”

显然,
节点
不是绝对路径

听起来您已经更改了
~/.bash_profile
或其他文件,以在
路径中包含
节点的位置

system
正在使用
sh-c
启动
bash

我忘记了确切的规则是什么,但是当以这种方式执行时,
bash
至少会忽略一些配置文件。您对
路径的更改可能未被读取或应用

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

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


如果您需要为
NSTask
创建自定义环境,请从
NSProcessInfo
中获取
environment
字典,进行更改,然后设置
NSTask
environment
属性

nodejs
安装程序使用
/usr/local/bin
,这不包括在从Finder启动的应用程序的
路径中:

/usr/bin:/bin:/usr/sbin:/sbin
该目录包含在通过
/etc/profile
&为
bash
设置的
路径中:

选项:

  • 只需编写
    /usr/local/bin/node
    而不是
    node

  • 通过
    环境
    属性调整
    NSTask
    使用的
    路径

  • 用于更改
    系统的
    路径
    -也会影响
    NSTask

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

因此,您可以执行我觉得更方便的
shell(“node-v”)

您确实安装了名为
node
的命令行util吗?在终端中尝试
node-v
时会发生什么情况?在运行命令之前编写路径非常简单,谢谢。
/usr/bin:/bin:/usr/sbin:/sbin
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
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
}