From: Kendall Gifford Date: 2013-06-28T11:39:32+09:00 Subject: Re: #!/usr/bin/env: No such file or directory --047d7bdca32cd4e6fa04e02dc9ca Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On Thu, Jun 27, 2013 at 7:55 PM, Todd Sterben wrote: > Thanks for the responses. I should have been a bit more clear about my > UNIX skills. Not great, but I can move around and set permissions and > look at things like environment variables. So I had already set things > to execute. I still can't see what is up. Here is the code(again) and > files and symbolic links & path & permissions > > Here is my beautiful code: > > #!/usr/bin ruby > Change that to: #!/usr/bin/env ruby > > puts "Hello world!" > > which produces these errors: > > ./test.rb: line 1: =EF=BB=BF#!/usr/bin: No such file or directory > ./test.rb: line 3: puts: command not found > > /usr/bin is in PATH so it should not have a problem there: > > /usr/lib/lightdm/lightdm: > /usr/local/sbin: > /usr/local/bin:/usr/sbin: > /usr/bin:/sbin:/bin: > /usr/games: > /usr/bin/ruby > > ruby points, through symbolic links, to /usr/bin/ruby1.9.1 > > lrwxrwxrwx 1 root root 22 Jun 20 16:30 ruby -> /etc/alternatives/ruby > > lrwxrwxrwx 1 root root 18 Jun 20 16:30 ruby -> /usr/bin/ruby1.9.1 > > > -rwxr-xr-x 1 root root 5552 Mar 22 12:14 ruby1.9.1 > > And the code is here: > > -rwxrwxrwx 1 john john 41 Jun 27 18:41 test.rb > > I am going to /home/john to run the file ./test.rb > > And everything is executable > > -- > Posted via http://www.ruby-forum.com/. > Everything looks fine except for the one change I mentioned above. With the shebang line, you are telling bash to execute "/usr/bin/env", passing it one parameter, "ruby". The "env" program will then launch the appropriate "ruby" executable. The reason for this is that "shebang" line must specify a complete path to an executable (either an absolute path or one relative to the current working directory; relative paths are problematic though so everyone uses absolute paths). Since the "ruby" executable may be installed in a different location on different systems, the convention is to instead run ruby via the "env" command for which it is safe to assume it'll be available in the /usr/bin directory. The "env" command lets you run other commands in a modified environment. However, in this case, it's just being used for the fact that it'll look up whatever command you tell it to run using the PATH environment variable. So, as long as an executable (or a symlink to one) is in one of the directories in your PATH (which is the case on your system) then "env" can run it. You can try it manually inside your shell (the "^D" mean, type CTRL-D; you won't actually see the "^D" characters): $ /usr/bin/env ruby puts "Hi" ^D Hi $ The above runs ruby which reads it's input (ruby code) from the terminal. The CTRL-D tells ruby it's reached the end of the file so it will exit, at which point it will run whatever ruby code you entered (outputting "Hi" to the terminal). --=20 Kendall Gifford zettabyte@gmail.com --047d7bdca32cd4e6fa04e02dc9ca Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
On Thu, Jun 27, 2013 at 7:55 PM, Todd Sterben <lists@r= uby-forum.com> wrote:
Thanks for the responses. =C2=A0I should hav= e been a bit more clear about my
UNIX skills. =C2=A0Not great, but I can move around and set permissions and=
look at things like environment variables. =C2=A0So I had already set thing= s
to execute. =C2=A0I still can't see what is up. =C2=A0Here is the code(= again) and
files and symbolic links & path & permissions

Here is my beautiful code:

#!/usr/bin ruby

Change that to: #!/usr/= bin/env ruby
=C2=A0

puts "Hello world!"

which produces these errors:

./test.rb: line 1: =EF=BB=BF#!/usr/bin: No such file or directory
./test.rb: line 3: puts: command not found

/usr/bin is in PATH so it should not have a problem there:

/usr/lib/lightdm/lightdm:
/usr/local/sbin:
/usr/local/bin:/usr/sbin:
/usr/bin:/sbin:/bin:
/usr/games:
/usr/bin/ruby

ruby points, through symbolic links, to /usr/bin/ruby1.9.1

lrwxrwxrwx 1 root root =C2=A0 22 Jun 20 16:30 ruby -> /etc/alternatives/= ruby

lrwxrwxrwx 1 root root 18 Jun 20 16:30 ruby -> /usr/bin/ruby1.9.1


-rwxr-xr-x 1 root root 5552 Mar 22 12:14 ruby1.9.1

And the code is here:

-rwxrwxrwx 1 john john 41 Jun 27 18:41 test.rb

I am going to /home/john to run the file ./test.rb

And everything is executable

--
Posted via http://= www.ruby-forum.com/.

Every= thing looks fine except for the one change I mentioned above.

=
With the shebang line, you are telling bash to e= xecute "/usr/bin/env", passing it one parameter, "ruby"= . The "env" program will then launch the appropriate "ruby&q= uot; executable.

The reason for this is that "sheb= ang" line must specify a complete path to an executable (either an abs= olute path or one relative to the current working directory; relative paths= are problematic though so everyone uses absolute paths). Since the "r= uby" executable may be installed in a different location on different = systems, the convention is to instead run ruby via the "env" comm= and for which it is safe to assume it'll be available in the /usr/bin d= irectory.

The "env" command lets you r= un other commands in a modified environment. However, in this case, it'= s just being used for the fact that it'll look up whatever command you = tell it to run using the PATH environment variable. So, as long as an execu= table (or a symlink to one) is in one of the directories in your PATH (whic= h is the case on your system) then "env" can run it.

You c= an try it manually inside your shell (the "^D" mean, type CTRL-D;= you won't actually see the "^D" characters):

$ /usr/bin/env ruby
puts "Hi"
^D
Hi
$

The above runs ruby which reads it's input (ruby code)= from the terminal. The CTRL-D tells ruby it's reached the end of the f= ile so it will exit, at which point it will run whatever ruby code you ente= red (outputting "Hi" to the terminal).

--
Kendall Gifford
zettabyte@gmail.com
--047d7bdca32cd4e6fa04e02dc9ca--