我在终端中使用以下代码运行一些命令:
system("the command here")
然后,我想知道运行此命令的结果是什么,例如,如果运行
system("git status")
我想阅读有关回购中更改的实际信息。有什么办法可以迅速做到这一点?
NSTask
是用于将另一个程序作为子进程运行的类。您可以捕获程序的输出,错误输出,退出状态等等。
扩展我对xcode 6 swiftsystem()命令的回答,这是一个简单的实用函数,用于同步运行命令,并返回输出,错误输出和退出代码(现已针对Swift 2更新):
func runCommand(cmd : String, args : String...) -> (output: [String], error: [String], exitCode: Int32) {
var output : [String] = []
var error : [String] = []
let task = NSTask()
task.launchPath = cmd
task.arguments = args
let outpipe = NSPipe()
task.standardOutput = outpipe
let errpipe = NSPipe()
task.standardError = errpipe
task.launch()
let outdata = outpipe.fileHandleForReading.readDataToEndOfFile()
if var string = String.fromCString(UnsafePointer(outdata.bytes)) {
string = string.stringByTrimmingCharactersInSet(NSCharacterSet.newlineCharacterSet())
output = string.componentsSeparatedByString("\n")
}
let errdata = errpipe.fileHandleForReading.readDataToEndOfFile()
if var string = String.fromCString(UnsafePointer(errdata.bytes)) {
string = string.stringByTrimmingCharactersInSet(NSCharacterSet.newlineCharacterSet())
error = string.componentsSeparatedByString("\n")
}
task.waitUntilExit()
let status = task.terminationStatus
return (output, error, status)
}
用法示例:
let (output, error, status) = runCommand("/usr/bin/git", args: "status")
print("program exited with status \(status)")
if output.count > 0 {
print("program output:")
print(output)
}
if error.count > 0 {
print("error output:")
print(error)
}
或者,如果您仅对输出感兴趣,而不对错误消息或退出代码感兴趣:
let output = runCommand("/usr/bin/git", args: "status").output
输出和错误输出以字符串数组形式返回,每行一个字符串。
的第一个参数runCommand()
必须是可执行文件的完整路径,例如"/usr/bin/git"
。您可以使用外壳程序启动程序(system()
也可以这样做):
let (output, error, status) = runCommand("/bin/sh", args: "-c", "git status")
优点是可以通过默认搜索路径自动找到“ git”可执行文件。缺点是,如果参数包含空格或其他在Shell中具有特殊含义的字符,则必须正确引用/转义参数。
Swift 3 更新 :
func runCommand(cmd : String, args : String...) -> (output: [String], error: [String], exitCode: Int32) {
var output : [String] = []
var error : [String] = []
let task = Process()
task.launchPath = cmd
task.arguments = args
let outpipe = Pipe()
task.standardOutput = outpipe
let errpipe = Pipe()
task.standardError = errpipe
task.launch()
let outdata = outpipe.fileHandleForReading.readDataToEndOfFile()
if var string = String(data: outdata, encoding: .utf8) {
string = string.trimmingCharacters(in: .newlines)
output = string.components(separatedBy: "\n")
}
let errdata = errpipe.fileHandleForReading.readDataToEndOfFile()
if var string = String(data: errdata, encoding: .utf8) {
string = string.trimmingCharacters(in: .newlines)
error = string.components(separatedBy: "\n")
}
task.waitUntilExit()
let status = task.terminationStatus
return (output, error, status)
}
我知道有很多关于这个的线索,但是没有一个对我有用。以下是我试图做的: Javac并从我的java代码中运行一个文件。它适用于视窗系统,但我想让它也适用于UNIX。代码如下: 问题是,在UNIX系统上,它的行为“不可预测”,例如: 打开图像,但 它什么也没做。没有按摩。 我非常感谢您的任何意见。 更新--------------------------------------------------
关于通过Java向终端发送命令,我遇到了一个非常令人困惑的问题。我有这个密码: 第一个命令是这个"useradd user-p密码-d /home/ftp/test/-s /bin/false",第二个应该是这个回显用户名:new_password|chpasswd,第一个命令工作没有任何问题,并创建了我定义的用户"服务器"变量,但当我试图执行第二个命令来改变用户传递此命令可能永远不会发生,输出为
问题内容: 我正在使用运行时从Java程序运行命令提示符命令。但是,我不知道如何获得命令返回的输出。 这是我的代码: 我尝试做,;但是没有返回任何东西。该命令的执行应返回两个数字,以分号分隔。我怎样才能在变量中打印出来? 这是我现在使用的代码: 但是我没有得到任何输出,但是当我自己运行该命令时,它可以正常工作。 问题答案: 这是要走的路:
问题内容: 我正在尝试从Java执行SOX命令,但不幸的是,它每次都会返回错误。其他所有SOX命令都可以正常运行!!这是代码: 当我在终端中执行相同的sox命令时,它的工作正常。我真的不明白问题是什么!是因为“ |” 符号?? 问题答案: 问题是Runtime.exec()无法理解shell概念,例如“ |”。而是尝试: 问题是exec直接运行二进制文件而不调用shell。“ |” 字符只能被外壳
M1 Mac系统终端< code>firebase模拟器:启动按预期工作。 但VSCode在同一命令上集成了终端错误(错误如下)。 我该如何解决这个问题? 如果重要的话,我同时使用Fish和Zsh,并且两者的行为是一致的:Fish和Zsh都在Mac终端应用程序中运行命令,但不是从VSCode的集成终端运行。 从VSCode集成终端运行时出错:
问题 你想执行一个外部命令并以Python字符串的形式获取执行结果。 解决方案 使用 subprocess.check_output() 函数。例如: import subprocess out_bytes = subprocess.check_output(['netstat','-a']) 这段代码执行一个指定的命令并将执行结果以一个字节字符串的形式返回。 如果你需要文本形式返回,加一个解码步