2016-11-24 93 views
4

我有一個命令行應用程序A,並在A我執行一個可執行腳本B,在B我期待從標準輸入輸入。從stdin獲取輸入在Cocoa命令行應用程序的子進程中

我寫了一個演示,在斯威夫特實施A,使用FoundationProcess API,發現B,在任何一種語言,無論實現的,不能從標準輸入獲取用戶輸入。

代碼:

// `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)") 

我沒有設置process的輸入根據該文檔,因爲:

如果不使用這種方法,標準輸入從工藝繼承那創造了接收器。


UPDATE:

A是用斯威夫特包管理器創建的可執行程序包。我使用swift package generate-xcodeproj來生成Xcode項目文件。我確認如果我在shell中運行使用swift buildxcodebuild構建的可執行文件,則出現從B的stdin獲取輸入的問題。但是,如果我直接在Xcode中運行它,通過在Xcode內按command + R,然後它工作。所以如果我理解在shell和Xcode中運行可執行文件的區別,我可能會使所有的工作都成功。

+0

你是否允許通過從命令行'shell'內置插件的輸入? – Inian

+0

@Inian我不熟悉你提到的概念(這與shell本身有關?),但是我在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() 

希望它可以幫助

相關問題