2016-11-24 3 views
4

У меня есть приложение командной строки A, и в A я выполнить исполняемый скрипт B, в B Я ожидаю, что входной сигнал от стандартного ввода.Получение вход со стандартного входа в суб процесса какао командной строки, приложения

Я написал демку, внедрение A в Swift, используя Foundation «s Process апи, находя, что 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 «ы, так как в соответствии с Doc:

Если этот метод не используется, стандартный ввод унаследована от процесса который создал приемник.


UPDATE:

A представляет собой исполняемый пакет, созданный с помощью диспетчера Swift пакета. Я использовал swift package generate-xcodeproj для создания файла проекта Xcode. Я подтвердил, что если я запустил исполняемый файл, построенный с использованием swift build или xcodebuild в оболочке, возникла проблема с получением ввода от stdin от B. Однако, если я запускаю его непосредственно внутри Xcode, нажав command + R внутри Xcode, он сработает. Поэтому, если я понимаю разницу между запуском исполняемого файла в оболочке и Xcode, я, вероятно, могу заставить все работать.

+0

Вы разрешили пройти входной сигнал от 'shell' встроенных модулей из командной строки? – Inian

+0

@ Inian Я не знаком с концепцией, которую вы упоминаете (что связано с самой оболочкой?), Но я написал 'A' в Ruby и работает так, как я ожидал. Если вы считаете, что это может быть связано, вы могли бы предоставить дополнительную информацию? – 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() 

Надеется, что это помогает

 Смежные вопросы

  • Нет связанных вопросов^_^