在Swift中从Cocoa App运行终端命令失败:“找不到命令”但在swift

时间:2017-08-08 23:31:59

标签: swift xcode macos cocoa

我创建了一个应用程序,将我的所有iMessages导出到我用于日记的应用程序中。它访问Libary / Messages /中的chat.db文件来执行此操作。这部分效果很好

我被要求使用框架,命令行工具不允许您在macOS中捆绑框架。我本来希望这一切都是一个脚本并完全避免使用Cocoa,但由于需要捆绑的框架,因此需要使用完整的Cocoa应用程序

我可以输入pwd之类的命令并获得回复。但是,当我尝试运行日记应用程序的终端命令时,它会因“找不到命令”而失败

如果我在终端内运行完全相同的命令,或者从Xcode中的Swift命令行工具中运行完全相同的命令,它就可以运行。但是,现在我正在使用一个实际的Cocoa应用程序,它将无法正常工作。

以下是我的代码示例:

   let pipe = Pipe()
let task = Process()
task.launchPath = "/bin/sh"
task.arguments = ["-c", String(format:"%@", "dayone2 new 'Hello'")]
task.standardOutput = pipe
let file = pipe.fileHandleForReading
task.launch()
if let result = NSString(data: file.readDataToEndOfFile(), encoding: String.Encoding.utf8.rawValue) {
    return result as String
}
else {
    return "--- Error running command - Unable to initialize string from file data ---"
}

和回应: /bin/sh: dayone2: command not found

1 个答案:

答案 0 :(得分:1)

添加"--login"作为第一个任务参数:

task.arguments = ["--login", "-c", "dayone2 new 'Hello'"]

这应该可以解决您的错误。

说明:

运行终端时,shell从man sh

启动为登录shell
  

当bash被调用为交互式登录shell时,或者作为   具有--login选项的非交互式shell,如果该文件存在,它首先从文件/etc/profile读取并执行命令。读取该文件后,它会按顺序查找~/.bash_profile~/.bash_login~/.profile,并从第一个存在且可读的命令中读取和执行命令。

这些文件中的命令通常设置$PATH环境变量,该变量定义shell用于查找命令的搜索路径。

当您在终端中运行命令行工具时,它会继承此环境变量,然后将其传递给它调用的shell以运行dayone2命令。

运行GUI应用程序时,没有底层shell,$PATH变量设置为系统默认值。您的错误“未找到命令”表示您的dayone2命令不在默认路径上。

HTH