iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど
NDKの利用などの理由で、統合環境を利用しないでAndroidの開発を行わざるおえないことがある。その際、困るのがデバッグログの確認。自分は以下のシャルスクリプトでデバッグログの表示と保存を行っている。
#!/bin/sh
today=`date +%Y%m%d`
adb logcat -v time | tee -a ${today}.txt
# End Of File
ログは実行した日付のログに出力され、停止し実行した場合も、既存のログに追加される形で記録される。
スクリプト言語の代わりにcommand-line環境でSwiftを利用するため、引数の取得や標準入出力について調べてみた。
引数の取得は以下の通り。
let args = Process.arguments
for arg in args {
print(arg)
}
標準入力からreturnされるまでを読み込むのは以下の通り。
let standardInput = NSFileHandle.fileHandleWithStandardInput()
let input = standardInput.availableData
let datastring = String(NSString(data:input, encoding:NSUTF8StringEncoding))
print(datastring)
return単位で読み込み続ける場合は、以下となる。
let standardInput = NSFileHandle.fileHandleWithStandardInput()
while true {
let input = standardInput.availableData
if input.length == 0 { break }
let datastring = String(NSString(data:input, encoding:NSUTF8StringEncoding))
print(datastring)
}
上記は、空行が来るとループを抜ける。
標準出力への印字は以下の通り。
let standardOutput = NSFileHandle.fileHandleWithStandardOutput()
let outputString: NSString = "hello\n"
let dataout: NSData? = outputString.dataUsingEncoding(NSUTF8StringEncoding)
if let dout = dataout {
standardOutput.writeData(dout)
}
同じ文字列を標準エラー出力に印字する場合。
let standardError = NSFileHandle.fileHandleWithStandardError()
if let dout = dataout {
standardError.writeData(dout)
}
後で流用できるよう、これらを全部つなげた完全なスクリプトを載せる。
#!/usr/bin/env xcrun swift
import Foundation
let args = Process.arguments
for arg in args {
print(arg)
}
let standardInput = NSFileHandle.fileHandleWithStandardInput()
//while true {
let input = standardInput.availableData
// if input.length == 0 { break }
let datastring = String(NSString(data:input, encoding:NSUTF8StringEncoding))
print(datastring)
//}
let standardOutput = NSFileHandle.fileHandleWithStandardOutput()
let outputString: NSString = "hello\n"
let dataout: NSData? = outputString.dataUsingEncoding(NSUTF8StringEncoding)
if let dout = dataout {
standardOutput.writeData(dout)
}
let standardError = NSFileHandle.fileHandleWithStandardError()
if let dout = dataout {
standardError.writeData(dout)
}
/* End Of File */