我在Ruby中使用Docopt来解析我的命令选项,稍后在脚本中我使用gets.chomp
获取控制台输入。问题是,在Docopt用options = Docopt::docopt(doc)
进行解析之后,运行程序的所有args仍然留在ARGF中,并且在尝试从STDIN获取之前从ARGF执行获取命令。 / p>
我已尝试清除ARGF,但由于某种原因执行ARGF.gets
尝试将输入作为命令运行。我认为清除ARGF或使用其他输入法可能都是解决方案,但我还没有发现任何东西。我必须想象我并不是第一个尝试使用Docopt在Ruby中获取交互式命令行输入的人,所以我希望答案就在那里。
为那些想要它的人提供更多代码:
#!/usr/bin/ruby
require 'docopt'
doc=<<eos
Usage:
account_creator.rb --noldap [options]
Options:
-h, --help Show help page
-l, --ldap
-n, --noldap
-s SERVER With or without http[s]://, followed by port
--ad
--od
-d NUM
-u USER
-p PASS
-o OUTPUT-FILE Default behavior is to append output to file if it exists
eos
options = {}
begin
options = Docopt::docopt(doc)
rescue Docopt::Exit => e
puts e.message
exit 1
end
if options['-u']
username = options['-u']
else
while username.eql? '' or username == nil
puts "Enter Username:"
username = Kernel.gets.chomp.strip
end
end
答案 0 :(得分:0)
这与docopt无关。自己尝试一下:
$ cat test.rb
#!/usr/bin/ruby
puts "Enter Username:"
username = gets
$ ./test.rb something
Enter Username:
./test.rb:4:in `gets': No such file or directory - something (Errno::ENOENT)
from ./test.rb:4:in `gets'
from ./test.rb:4:in `<main>'
ruby中的 Kernel.gets
使用ARGF.gets
。使用STDIN.gets
可以获得预期的行为。请参阅this SO question。