Запуск ruby-скрипта из другой странной ошибки с использованием gets

Я написал рубиновый скрипт, который затем вызывает другой рубиновый скрипт. Сценарий вызываемого объекта очень длинный и содержит множество входных данных.

Итак, что я делаю, так это открываю свой терминал unix, вызываю сценарий вызывающего абонента, который затем выполняет эту простую строку:

load "calleeScript.rb"

CalleeScript.rb был упрощен, чтобы сделать это:

input = gets.chomp

print input

Но это просто дает мне ошибку, как будто он не может обрабатывать запросы. Ошибка говорит:

./getsTest.rb:3:in `gets': Нет такого файла или каталога - 5 (Errno::ENOENT) из ./getsTest.rb:3

Даже если я вытащу это, он не будет печатать/помещать в терминал. Итак, есть идеи, как я вызываю один сценарий, который затем вызывает другой сценарий (либо отказываясь от полного контроля, либо разветвляясь), выполняя некоторые вводы/выводы и все же возвращаясь к предыдущему сценарию?


person fvertk    schedule 07.06.2012    source источник
comment
Можете ли вы свести это к двум файлам, каждый из которых состоит примерно из пяти строк?   -  person sarnold    schedule 08.06.2012
comment
Эй, Сарнольд, первые два блока кода — это буквально скрипт вызывающего и вызываемого абонентов соответственно (я сократил их, чтобы изолировать проблему). Но, как я уже говорил, проблема, похоже, ушла. Хотел бы я знать, в чем проблема, чтобы я мог написать это здесь.   -  person fvertk    schedule 08.06.2012
comment
О, вау, это чертовски хорошая работа по строганию. Спасибо!   -  person sarnold    schedule 09.06.2012


Ответы (1)


Kernel#gets — это удобный метод, позволяющий обрабатывать ввод как через стандартный ввод, так и через файлы.

Если вы вызываете свой скрипт без каких-либо аргументов, т.е. так:

getsTest.rb

Затем Kernel#gets считывает свой ввод со стандартного ввода. Однако если вы вызываете свой скрипт следующим образом:

getsTest.rb foo.txt

Затем Kernel#gets считывает ввод из файла с именем foo.txt.

В вашем случае Kernel#gets жалуется, что не может найти файл с именем 5, поэтому, предположительно, вы назвали свой скрипт примерно так:

getsTest.rb 5

Если вы хотите читать из определенного источника, вам следует вызвать IO#gets для этого конкретного источника. я предлагаю позвонить

$stdin.gets

Примечание: с технической точки зрения, это свойство не Kernel#gets, а магической константы ARGF. По сути, Kernel#gets просто звонит ARGF.gets.

person Jörg W Mittag    schedule 07.06.2012
comment
На самом деле это не включение аргумента командной строки, вызывающее проблему (я случайно опубликовал неправильную ошибку). Когда я вызываю его без параметра 5, это дает мне ошибку: - person fvertk; 08.06.2012
comment
$ ./getsTest.rb:1:in `gets': Ошибка ввода/вывода (Errno::EIO) И когда я делаю $stdin.gets в вызываемом сценарии, это дает мне ту же ошибку. Я просто пытаюсь, чтобы вызываемый сценарий мог выполнять вход в терминал, потому что в противном случае я не знаю, как разрешить вызываемому сценарию даже получать ввод в реальном времени. - person fvertk; 08.06.2012
comment
Странно, однако, теперь, когда я немного подождал и пересмотрел его, похоже, он работает. Так что я поставлю это как решение, так как вы все равно дали мне много полезной информации! - person fvertk; 08.06.2012