美文网首页IOS开发
iOS:mac.app执行shell命令

iOS:mac.app执行shell命令

作者: Liu____ | 来源:发表于2020-07-15 09:39 被阅读0次

报错

1:
错误:

/bin/bash: line 1: /Users/liuyaqiang/Desktop/GitHub/KTMRobot/auto.sh: Operation not permitted

解决方法:

Singing&Capabilitiesy移除AppSandbox

代码


import Cocoa
 
class  CommandRunner: NSObject {
    
    /** 同步执行
     *  command:    shell 命令内容
     *  returns:    命令行执行结果,积压在一起返回
     *
     *  使用示例
        let (res, rev) = CommandRunner.sync(command: "ls -l")
        print(rev)
     */
    static func sync(command: String) -> (Int, String) {
        let utf8Command = "export LANG=en_US.UTF-8\n" + command
        return sync(shellPath: "/bin/bash", arguments: ["-c", utf8Command])
    }
    
    /** 同步执行
     *  shellPath:  命令行启动路径
     *  arguments:  命令行参数
     *  returns:    命令行执行结果,积压在一起返回
     *
     *  使用示例
        let (res, rev) = CommandRunner.sync(shellPath: "/usr/sbin/system_profiler", arguments: ["SPHardwareDataType"])
        print(rev)
     */
    static func sync(shellPath: String, arguments: [String]? = nil) -> (Int, String) {
        let task = Process()
        let pipe = Pipe()
        
        var environment = ProcessInfo.processInfo.environment
        environment["PATH"] = "/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
        task.environment = environment
        
        if arguments != nil {
            task.arguments = arguments!
        }
        
        task.launchPath = shellPath
        task.standardOutput = pipe
        task.launch()
        
        let data = pipe.fileHandleForReading.readDataToEndOfFile()
        let output: String = String(data: data, encoding: String.Encoding.utf8)!
        
        task.waitUntilExit()
        pipe.fileHandleForReading.closeFile()
        
        return (Int(task.terminationStatus), output)
    }
    
    /** 异步执行
     *  command:    shell 命令内容
     *  output:     每行的输出内容实时回调(主线程回调)
     *  terminate:  命令执行结束状态(主线程回调)
     *
     *  使用示例
        CommandRunner.async(command: "ls -l",
                            output: {[weak self] (str) in
                                self?.appendLog(str: str)
                            },
                            terminate: {[weak self] (code) in
                                self?.appendLog(str: "end \(code)")
                            })
     */
    static func async(command: String,
                      output: ((String) -> Void)? = nil,
                      terminate: ((Int) -> Void)? = nil) {
        let utf8Command = "export LANG=en_US.UTF-8\n" + command
        async(shellPath: "/bin/bash", arguments: ["-c", utf8Command], output:output, terminate:terminate)
    }
    
    /** 异步执行
     *  shellPath:  命令行启动路径
     *  arguments:  命令行参数
     *  output:     每行的输出内容实时回调(主线程回调)
     *  terminate:  命令执行结束状态(主线程回调)
     *
     *  使用示例
        CommandRunner.async(shellPath: "/usr/sbin/system_profiler",
                            arguments: ["SPHardwareDataType"],
                            output: {[weak self] (str) in
                                self?.appendLog(str: str)
                            },
                            terminate: {[weak self] (code) in
                                self?.appendLog(str: "end \(code)")
                            })
     */
    static func async(shellPath: String,
                      arguments: [String]? = nil,
                      output: ((String) -> Void)? = nil,
                      terminate: ((Int) -> Void)? = nil) {
        DispatchQueue.global().async {
            let task = Process()
            let pipe = Pipe()
            let outHandle = pipe.fileHandleForReading
            
            var environment = ProcessInfo.processInfo.environment
            environment["PATH"] = "/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
            task.environment = environment
            
            if arguments != nil {
                task.arguments = arguments!
            }
            
            task.launchPath = shellPath
            task.standardOutput = pipe
            
            outHandle.waitForDataInBackgroundAndNotify()
            var obs1 : NSObjectProtocol!
            obs1 = NotificationCenter.default.addObserver(forName: NSNotification.Name.NSFileHandleDataAvailable,
                                                          object: outHandle, queue: nil) {  notification -> Void in
                                                            let data = outHandle.availableData
                                                            if data.count > 0 {
                                                                if let str = NSString(data: data, encoding: String.Encoding.utf8.rawValue) {
                                                                    DispatchQueue.main.async {
                                                                        output?(str as String)
                                                                    }
                                                                }
                                                                outHandle.waitForDataInBackgroundAndNotify()
                                                            } else {
                                                                NotificationCenter.default.removeObserver(obs1)
                                                                pipe.fileHandleForReading.closeFile()
                                                            }
            }
            
            var obs2 : NSObjectProtocol!
            obs2 = NotificationCenter.default.addObserver(forName: Process.didTerminateNotification,
                                                          object: task, queue: nil) { notification -> Void in
                                                            DispatchQueue.main.async {
                                                                terminate?(Int(task.terminationStatus))
                                                            }
                                                            NotificationCenter.default.removeObserver(obs2)
            }
            
            task.launch()
            task.waitUntilExit()
        }
    }
}


相关文章

  • iOS:mac.app执行shell命令

    报错 1:错误: 解决方法: 代码

  • vim学习 09——shell命令

    vim学习 09——shell命令 执行 shell 命令 :!shell命令 : 可以执行 shell 命令。 ...

  • java远程执行shell命令失败

    需要通过java远程登录linux系统执行shell命令,执行的shell命令是 这条命令在linux下执行完全没...

  • Java & Groovy & Scala & Kotlin -

    Overview 本章主要介绍如何通过这几种语言来执行 Shell 命令。 Java 执行 Shell 命令 Ja...

  • shell 命令

    Linux shell执行命令有三种: 内建命令, shell函数和外部命令 内部命令: shell程序本身包含的...

  • Shell脚本(中)

    shell 数组 shell内建命令 通常来说,内建命令会比外部命令执行得更快,执行外部命令时不但会触发磁盘 I/...

  • redis命令

    shell下执行redis命令

  • shell家族来了,还不赶快学习

    shell家族 shell:命令解释器,根据输入的命令执行相应命令。 察看当前系统下有哪些shell: cat/e...

  • shell中的内建命令, 函数和外部命令

    Shell识别三种基本命令:内建命令、Shell函数以及外部命令:(1)内建命令就是由Shell本身所执行的命令。...

  • shell基础

    shell脚本 1.shell脚本执行方式 1.1 添加执行权 1.2 指定shell命令 2.shell变量 2...

网友评论

    本文标题:iOS:mac.app执行shell命令

    本文链接:https://www.haomeiwen.com/subject/vuxdhktx.html