命令行 "launch path not accessible"
Command line "launch path not accessible"
我最近发现我可以创建 Swift 命令行脚本。
我决定看看是否可以使用它构建我的 Xamarin 项目。
不幸的是,我收到以下错误,我不知道如何解决。
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'launch path not accessible'
这是我的脚本:
#!/usr/bin/env swift
import Foundation
print("Building Script")
let fileManager = NSFileManager.defaultManager()
let path = fileManager.currentDirectoryPath
func shell(launchPath: String, arguments: [String] = []) -> NSString? {
let task = NSTask()
task.launchPath = launchPath
task.arguments = arguments
let pipe = NSPipe()
task.standardOutput = pipe
task.launch()
let data = pipe.fileHandleForReading.readDataToEndOfFile()
let output = NSString(data: data, encoding: NSUTF8StringEncoding)
return output
}
if let output = shell("/Applications/Xamarin\ Studio.app/Contents/MacOS/mdtool", arguments: ["-v build", "\"--configuration:Beta|iPhone\"", "MyApp.iOS.sln"]) {
print(output)
}
有什么想法吗?
我认为问题是你实际上想要执行shell并让它执行mdtool,而不是直接执行mdtool
尝试将“/bin/bash”作为启动路径传递,然后将 mdtool 的路径作为参数字符串的一部分。
最近遇到了类似的问题,但是我的解决方法不一样
我通过更改脚本的权限模式解决了这个问题。具体来说,chmod 777 xxx
。关键是给执行权限。
我们来做个对照实验来验证一下:
使用路径 /tmp/a.sh
和权限 666
准备脚本
/tmp/a.sh
内容:
#!/bin/sh
echo aaa
- 准备一个
swift
脚本来启动脚本:
import Foundation
let fileManager = FileManager.default
let path = fileManager.currentDirectoryPath
func shell(launchPath: String, arguments: [String] = []) -> NSString? {
let task = Process()
task.launchPath = launchPath
task.arguments = arguments
let pipe = Pipe()
task.standardOutput = pipe
task.launch()
let data = pipe.fileHandleForReading.readDataToEndOfFile()
let output = NSString(data: data, encoding: String.Encoding.utf8.rawValue)
return output
}
if let output = shell(launchPath: "/tmp/a.sh", arguments: []) {
print(output)
}
输出为:
... *** Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: 'launch path not accessible'
- 将
/tmp/a.sh
的权限更改为777
(通过授予执行权限),然后重新运行swift
脚本:
aaa
我的版本旨在突出各种预期结果。您可以将 ParsingError.encodingFailure
和 OS.Error.processFailure
替换为您自己的 Error
实现。
/// Getting a `Result` from a shell command
public func process(_ command: String) -> Result<String, Swift.Error> {
let process = Process()
process.launchPath = "/bin/bash"
process.arguments = ["-c", command]
let outputPipe = Pipe()
process.standardOutput = outputPipe
let errorPipe = Pipe()
process.standardError = errorPipe
process.launch()
let outputData = outputPipe.fileHandleForReading.readDataToEndOfFile()
guard let output = String(data: outputData, encoding: .utf8) else {
return .failure(ParsingError.encodingFailure(data: outputData))
}
let errorData = errorPipe.fileHandleForReading.readDataToEndOfFile()
guard let errorOutput = String(data: errorData, encoding: .utf8) else {
return .failure(ParsingError.encodingFailure(data: errorData))
}
process.waitUntilExit()
let status = Int(process.terminationStatus)
if status == 0, errorOutput.isEmpty {
return .success(output)
} else {
return .failure(OS.Error.processFailure(code: status, message: errorOutput))
}
}
我最近发现我可以创建 Swift 命令行脚本。
我决定看看是否可以使用它构建我的 Xamarin 项目。
不幸的是,我收到以下错误,我不知道如何解决。
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'launch path not accessible'
这是我的脚本:
#!/usr/bin/env swift
import Foundation
print("Building Script")
let fileManager = NSFileManager.defaultManager()
let path = fileManager.currentDirectoryPath
func shell(launchPath: String, arguments: [String] = []) -> NSString? {
let task = NSTask()
task.launchPath = launchPath
task.arguments = arguments
let pipe = NSPipe()
task.standardOutput = pipe
task.launch()
let data = pipe.fileHandleForReading.readDataToEndOfFile()
let output = NSString(data: data, encoding: NSUTF8StringEncoding)
return output
}
if let output = shell("/Applications/Xamarin\ Studio.app/Contents/MacOS/mdtool", arguments: ["-v build", "\"--configuration:Beta|iPhone\"", "MyApp.iOS.sln"]) {
print(output)
}
有什么想法吗?
我认为问题是你实际上想要执行shell并让它执行mdtool,而不是直接执行mdtool
尝试将“/bin/bash”作为启动路径传递,然后将 mdtool 的路径作为参数字符串的一部分。
最近遇到了类似的问题,但是我的解决方法不一样
我通过更改脚本的权限模式解决了这个问题。具体来说,chmod 777 xxx
。关键是给执行权限。
我们来做个对照实验来验证一下:
使用路径
准备脚本/tmp/a.sh
和权限666
/tmp/a.sh
内容:
#!/bin/sh
echo aaa
- 准备一个
swift
脚本来启动脚本:
import Foundation
let fileManager = FileManager.default
let path = fileManager.currentDirectoryPath
func shell(launchPath: String, arguments: [String] = []) -> NSString? {
let task = Process()
task.launchPath = launchPath
task.arguments = arguments
let pipe = Pipe()
task.standardOutput = pipe
task.launch()
let data = pipe.fileHandleForReading.readDataToEndOfFile()
let output = NSString(data: data, encoding: String.Encoding.utf8.rawValue)
return output
}
if let output = shell(launchPath: "/tmp/a.sh", arguments: []) {
print(output)
}
输出为:
... *** Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: 'launch path not accessible'
- 将
/tmp/a.sh
的权限更改为777
(通过授予执行权限),然后重新运行swift
脚本:
aaa
我的版本旨在突出各种预期结果。您可以将 ParsingError.encodingFailure
和 OS.Error.processFailure
替换为您自己的 Error
实现。
/// Getting a `Result` from a shell command
public func process(_ command: String) -> Result<String, Swift.Error> {
let process = Process()
process.launchPath = "/bin/bash"
process.arguments = ["-c", command]
let outputPipe = Pipe()
process.standardOutput = outputPipe
let errorPipe = Pipe()
process.standardError = errorPipe
process.launch()
let outputData = outputPipe.fileHandleForReading.readDataToEndOfFile()
guard let output = String(data: outputData, encoding: .utf8) else {
return .failure(ParsingError.encodingFailure(data: outputData))
}
let errorData = errorPipe.fileHandleForReading.readDataToEndOfFile()
guard let errorOutput = String(data: errorData, encoding: .utf8) else {
return .failure(ParsingError.encodingFailure(data: errorData))
}
process.waitUntilExit()
let status = Int(process.terminationStatus)
if status == 0, errorOutput.isEmpty {
return .success(output)
} else {
return .failure(OS.Error.processFailure(code: status, message: errorOutput))
}
}