2017-01-18 1 views
3

Swiftスクリプトでシェルコマンドを連鎖しようとしています。問題の実際のコマンドはffmpegの入力にパイプgourceの出力ですが、ここで私が何をしようとしているの単純化され、不自然な例です:Swiftスクリプトのパイプでのシェルコマンドの結合

let echo = Process() 

echo.launchPath = "/usr/bin/env" 
echo.arguments = ["echo", "foo\nbar\nbaz\nbaz", "|", "uniq"] 

let pipe = Pipe() 
echo.standardOutput = pipe 

echo.launch() 
echo.waitUntilExit() 

// Get the data 
let data = pipe.fileHandleForReading.readDataToEndOfFile() 
let output = NSString(data: data, encoding: String.Encoding.utf8.rawValue) 

print(output ?? "no output") 

予想される出力:

foo 
bar 
baz 

は、実際の出力:

foo 
bar 
baz 
baz | uniq 
|

は、最後の引数の一部として解釈されています。 Swiftスクリプトで、コマンドを連鎖させて、データを1つから次の順に流すことはできますか? standardInstandardOutを割り当て、Pipe()を2つのProcessの間で使用するというさまざまな組み合わせを試みましたが、間違っているか、適切な部分を一緒に接続していません。

答えて

7

私はzadrからの助けを借りて答えました:同じ問題に実行していることがあり、他人のために

import Foundation 

let pipe = Pipe() 

let echo = Process() 
echo.launchPath = "/usr/bin/env" 
echo.arguments = ["echo", "foo\nbar\nbaz\nbaz"] 
echo.standardOutput = pipe 

let uniq = Process() 
uniq.launchPath = "/usr/bin/env" 
uniq.arguments = ["uniq"] 
uniq.standardInput = pipe 

let out = Pipe() 
uniq.standardOutput = out 

echo.launch() 
uniq.launch() 
uniq.waitUntilExit() 

let data = out.fileHandleForReading.readDataToEndOfFile() 
let output = NSString(data: data, encoding: String.Encoding.utf8.rawValue) 

print(output ?? "no output") 
+0

ありがとう!私はこれをやって、それを回避しようとしていた。 –

0

が、ここで私はSHA1 HMACハッシュを作成して合わせてZEVの回答から得られるものです:

func getHMAC(forValue value: String, key: String) -> String { 

    let pipe = Pipe() 

    let echo = Process() 
    echo.launchPath = "/usr/bin/env" 
    echo.arguments = ["echo", "-n", value] 
    echo.standardOutput = pipe 

    let task = Process() 
    task.launchPath = "/usr/bin/env" 
    task.arguments = ["openssl", "sha1", "-hmac", key] 
    task.standardInput = pipe 

    let output = Pipe() 
    task.standardOutput = output 

    echo.launch() 
    task.launch() 
    task.waitUntilExit() 

    let data = output.fileHandleForReading.readDataToEndOfFile() 
    return NSString(data: data, encoding: String.Encoding.utf8.rawValue) as! String 
} 

これは、HTTPヘッダーにハッシュを必要とするSwiftスクリプトから簡単なAPI呼び出しを行う場合に特に便利です。私が見つけた限り、これは可能でした(SwiftスクリプトでObjective-C CommonCryptoフレームワークを使用できないため)。

関連する問題