Используя #! комментарий в рубине работает в Ubuntu - PullRequest
5 голосов
/ 08 января 2009

Я новичок в программировании и пытаюсь следовать примеру, который использует #! комментарий в рубине.

Я постоянно получаю сообщение: bash: matz.rb: команда не найдена

Я использую этот комментарий: #! / usr / bin / env ruby ​​

Я пробовал с пробелом и без! а также с и без env.

когда я использую $ какой рубин

ruby ​​находится в: / usr / bin / ruby ​​

Я также вошел в операционную систему и изменил разрешения для файла matz.rb на rwx для всех пользователей без эффекта. Я делаю что-то не так или у меня неправильно настроена система?

Ответы [ 7 ]

10 голосов
/ 08 января 2009

Часть /usr/bin/env в порядке. Вам нужно указать bash путь к matz.rb, когда вы его запустите. Если вы находитесь в каталоге с matz.rb, введите «./matz.rb». Каталог "." означает текущий каталог - bash не выглядит там по умолчанию при запуске программ (как в Windows).

Программа env (/ usr / bin / env) ищет исполняемый путь поиска - переменная среды PATH - для программы ruby, как если бы вы ввели ее в командной строке, и запускает эту программу. Комментарий Шебанга не делает этого. Если вы хотите передать свой сценарий другим людям, у которых, возможно, не установлен ruby ​​в том же месте, что и вы, то вы должны использовать комментарий "#!/usr/bin/env ruby", чтобы он работал, пока они могут запускать ruby, набрав "ruby". ».

9 голосов
/ 08 января 2009

Если вы находитесь в том же каталоге, что и файл matz.rb, обязательно запустите его как

$ ./matz.rb

и не только

$ matz.rb

Вот сеанс оболочки, демонстрирующий эту работу:

$ ls -la m*
-rwxr-xr-x  1 gareth  gareth  32  8 Jan 08:46 matz.rb
$ cat matz.rb
#!/usr/bin/env ruby
puts "Matz"
$ matz.rb
-bash: matz.rb: command not found
$ ./matz.rb
Matz
3 голосов
/ 08 января 2009

Ваш файл не был создан в Windows, не так ли? Если у него есть \ r \ n окончания строки, это расстроит bash. Вы можете открыть его с помощью Vim и проверить:

vi matz.rb
:set ff=unix
:wq

Если при заполнении табуляции части "ff =" она говорит "душ", значит, файл имеет неправильный формат Либо запустите dos2unix и попробуйте снова запустить файл:

apt-get install sysutils
dos2unix matz.rb
2 голосов
/ 08 января 2009

Похоже, вы работаете в системе Unix / Linux и просто набираете matz.rb в командной строке. Если вы пытаетесь выполнить команду в текущем каталоге, вам нужно назвать ее как ./matz.rb. «./» указывает ему искать в текущем каталоге, а не просто / usr / bin и friends.

1 голос
/ 08 января 2009

Вы можете использовать строку 'shebang' с:

#!/usr/bin/ruby
#!/usr/bin/env ruby

Но скрипт должен быть исполняемым (вы указали, что он есть) и в вашей оболочке $ PATH.

echo $PATH

Поместите скрипт в один из этих каталогов или измените ваш путь, в противном случае укажите полный путь к нему, например:

export PATH=$PATH:/home/user/bin

или один из них:

./matz.rb
/home/user/bin/matz.rb

Вы также можете запустить интерпретатор Ruby, передав имя файла скрипта в качестве аргумента, и он будет выполнен. Это особенно полезно, если в вашей системе установлена ​​другая версия Ruby (скажем, для тестирования, например Ruby Enterprise Edition, REE ):

/usr/bin/ruby matz.rb
/opt/ree/bin/ruby matz.rb
1 голос
/ 08 января 2009

Я не смог увидеть никакого ответа, указывающего на то, что вы изменили режим выполнения файла, так что вы можете попробовать и сделать

chmod +x matz.rb

прежде чем идти и попробовать сделать

./matz.rb

Также может быть лучше не прикреплять расширение .rb к файлу, как в случае с обычными скриптами ruby ​​/ rails, например скрипт / генерация, скрипт / консоль и т. д.

0 голосов
/ 08 января 2009

Вы пробовали ShaBang, как указано ниже, чтобы напрямую указывать на рубин?

#! /usr/bin/ruby

Затем вы вызываете скрипт из командной строки как

./matz.rb

В системах Unix / Linux точка перед командой для поиска команды в текущем каталоге. Если вы укажете путь, например / usr / bin / ruby, он будет искать в текущем каталоге каталог usr ...

Команда без точки / спереди ищется в местах, указанных переменной пути среды.

Команда с / в начале ищется точно от корня по указанному пути.

Внутри вашего ShaBang вы хотите указать точный путь к интерпретатору, поэтому "/ usr / bin / ruby" является правильным. В командной строке, где вы хотите, чтобы ваш сценарий выполнялся, вам нужно вызвать сценарий с помощью «./matz.rb», иначе bash будет искать команду, подобную /usr/bin/matz.rb, что приведет к вашему сообщению об ошибке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...