2016-11-24 6 views
4

私はコマンドラインアプリケーションAを持っていて、Aに実行ファイルBを実行します。B私はstdinからの入力を期待しています。Cocoaコマンドラインアプリケーションのサブプロセスでstdinから入力を取得する

私は、どんな言語で実装に関係なく、標準入力からユーザー入力を取得することはできませんBことを見出し、FoundationProcess APIを使用して、スウィフトでAを実施し、デモを書きました。

コード:

// `A`'s main.swift 
import Foundation 
let process = Process() 
process.launchPath = PATH_TO_SCRIPT_B 
process.launch() 
process.waitUntilExit() 

// `B` 
#!/usr/bin/swift 
print("intpu something") 
let input = readLine() 
print("input: \(input)") 

私はDOCに従うためprocessの入力を設定しなかった:

この方法が使用されていない場合、標準入力がプロセスから継承されています受信者を作成した


UPDATE:

Aはスウィフトパッケージマネージャを使用して作成された実行可能パッケージです。私はswift package generate-xcodeprojを使ってXcodeプロジェクトファイルを生成しました。シェルでswift buildまたはxcodebuildを使ってビルドした実行可能ファイルを実行すると、stdinからの入力をBにする際の問題が発生することが確認されました。しかし、Xcodeの中でcommand + Rを押すと、Xcodeの中で直接実行すると、うまくいきました。したがって、シェルとXcodeで実行可能ファイルを実行することの違いを理解すれば、おそらくすべてを動作させることができます。

+0

を役に立てば幸いあなたは、コマンドラインから 'shell'組み込み関数からの入力を渡すことが許可されていますか? – Inian

+0

@Inian私はあなたが言及しているコンセプト(シェル自体に関連していますか?)に精通していませんが、私はRubyに 'A'を書いていました。これが関連していると思われる場合は、さらに情報を提供できますか? – axl411

答えて

1
func task() { 
    print("input here") 
    let x = input() 
    print ("inputed:" + x) 
} 

func input() -> String { 
    let keyboard = FileHandle.standardInput 
    let inputData = keyboard.availableData 
    let strData = String(data: inputData, encoding: .utf8)! 

    let string = strData.trimmingCharacters(in: .newlines) 
    return string 
} 

task() 

は、それが

関連する問題