如何用/ dev / tty覆盖stdin?

时间:2016-06-26 22:12:25

标签: stdin crystal-lang

我正在编写一个git pre-commit挂钩,但它需要用户输入并且挂钩不能在交互式终端中运行。使用Python,我可以做这样的事情来访问用户输入:

#!/usr/bin/python

import sys

# This is required because git hooks are run in non-interactive
# mode. You aren't technically supposed to have access to stdin.
# This hack works on MaxOS and Linux. Mileage may vary on Windows.
sys.stdin = open('/dev/tty')

result = input("Gimme some input: ")

在Crystal中执行此操作的适当方法是什么?

3 个答案:

答案 0 :(得分:2)

通过结合@ julian-portalier的答案和@ asterite,我们有办法重新定义stdin:

STDIN.reopen(File.open("/dev/tty", "a+"))

我认为,这只是FileDescriptor#reopen

STDINSTDOUTSTDERR都可以通过这种方式重新打开。

答案 1 :(得分:1)

您可以尝试:

STDIN.reopen("/dev/tty")

答案 2 :(得分:0)

这似乎有效:

file = File.open("/dev/tty")
line = file.gets
p line

您无法重新分配STDIN,我们没有可重新分配的全局变量。我对此知之甚少,可能会重新打开并且可以使用dup。但是,我想你可以在你的程序中使用file而不是STDIN