How to use multiple arguments in shebang lines

env command allows to find a script’s interpreter when its location is a non-standard one. In scripts it’s recommended to use env in shebang lines to find the executable and run it.

#!/usr/bin/env ruby

puts "Hello, world."
Ruby interpreter is used without any option.

On GNU/Linux if it’s necessary to run a script’s interpreter with options, env has to be used with -S to pass options in shebang lines.

#!/usr/bin/env -S ruby -Ilib:test:.

puts "Hello, world."
Ruby interpreter is used with `-I` option to specify $LOAD_PATH directories.

env could be also used with additional -v option. It’s usedful for debugging.

#!/usr/bin/env -vS ruby -Ilib:test:.

puts "Hello, world."

When executed, the script from above would produce the following output:

#env executing: ruby
#env    arg[0]= 'ruby'
#env    arg[1]= '-Ilib:test:.'
#env    arg[2]= 'bin/test.sh'
Hello, world.

TIL rating:
good to know

Read next

When it’s about writing tests for a Ruby project, I prefer minitest to anything else. It’s fast and doesn’t require to switch mental context to any domain-specific language (DSL). It’s just Ruby.

Because minitest allows to express tests using plain Ruby, Ruby is the only necessary tool to run those tests.

$ ruby -Ilib:test test/foo/test_foo_test.rb
Running minitest tests with Ruby.

That works fine for one file, but a bit tricky for multiple test files at once.

minitest comes with a Rake task to run all tests. However for small projects it might be to much to bring Rake just for that case.

So I wrote a script to run tests without anything but Ruby. It’s basically a wrapper around a test runner that comes with minitest.