【问题标题】:Ruby script doesn't wait for input in command promptRuby 脚本不等待命令提示符中的输入
【发布时间】:2013-02-07 14:06:59
【问题描述】:

我的 ruby​​ 脚本似乎没有等待我的输入。我正在尝试按照本书第一章中加密文件的脚本进行操作:wicked cool ruby​​,但在我在命令提示符下运行文件后,它不会等待我的输入。

导致问题的代码sn-p:

require 'crypt/blowfish'

unless ARGV[0]
   puts "Usage: ruby encrypt.rb <filename.ext>"
   puts "Example: ruby encrypt.rb secret.stuff"
   exit
end

#take in the file name to encrypt as an argument
filename = ARGV[0].chomp
puts filename

c = "Encrypted_#{filename}"

if File.exists?(c)
   puts "File already exists."
   exit
end

print 'Enter your encryption key (1-56 bytes): '
kee = gets.chomp

begin
   blowfish = Crypt::Blowfish.new(kee)
   blowfish.encrypt_file(filename.to_str, c)
   puts 'Encryption SUCCESS!'
rescue Exception => e
   puts "An error occurred during encryption: \n #{e}"
end

我尝试运行文件后在 cmd 中看到的内容:

C:\Users\me\>ruby new4.rb fileToEnrypt.txt
Enter your encryption key (1-56 bytes): An error occurred during encryption:
 can't convert String into Integer
C:\Users\me\>

【问题讨论】:

  • 如果能提供更多代码就太好了。
  • 似乎在这里工作,我不明白问题是什么..
  • 只需提供所有代码。
  • 不需要chomp这个:filename = ARGV[0].chomp。 ARGV 元素没有尾随换行符...嗯,它们可以,但你必须不遗余力地把它们放在那里。
  • 非常感谢铁皮人提供的信息。

标签: ruby command-prompt


【解决方案1】:

这里有两个问题:

关于您没有收到用户提示这一事实,请将您的代码替换为:

kee = $stdin.gets.chomp

关于错误信息,是因为:

密钥介于 64 和 448 位(8 和 56 字节)之间,并且 应该作为打包字符串传递

【讨论】:

  • 这让我输入了我需要的内容,但我认为 Saurabh 说 gem 与 1.9 不兼容是正确的。
  • 你能说说为什么我需要 $stdin.gets.chomp 而不是只需要 gets.chomp 吗?
  • 似乎gets 单独将传递的参数传递给脚本(如果有)。如果没有参数,则询问用户,而$stdin.gets 总是提示用户。
【解决方案2】:

这是因为您尝试使用加密将字符串转换为整数。

kee = gets.chomp 正在根据您提供的输入返回一个字符串,这是一个字符串,并且当您将字符串加密为整数时,将发生错误。

错误信息本身说:

can't convert String into Integer

此外,您使用的 gem 显然尚未更新为可与 Ruby 一起使用 1.9.

source 表示 gem 中可能存在其他不兼容问题。

【讨论】:

  • 根据问题,脚本甚至不允许输入任何内容。注意错误消息。在print 消息和rescue 块中的puts 之后没有新行。这意味着用户甚至没有机会输入任何内容。
  • 这与 ruby​​ 1.9 不兼容。
  • 感谢 ByScripts 实际上回答了我的问题,但您提供了很好的信息,谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-12-26
  • 1970-01-01
  • 2015-02-27
  • 2011-10-25
  • 1970-01-01
  • 1970-01-01
  • 2012-11-10
  • 2011-10-13
相关资源
最近更新 更多