Ever opened a file and found #!/bin/sh or something similar at the top? That’s a shebang aka hashbang (they go by many names). When the program loader sees a shebang it will run the program and pass the rest of the file in as the first argument.

Shebangs let you set a command to run before running the rest of the file

What are shebangs used for?

The save you having to declare how to run a file. For example: Say you have a Ruby file named foobar.rb, to run that file using the Ruby interpretor you’d need to run ruby foobar.rb in your terminal.

puts "Hello World!"

# To run this file you'll need to use `ruby foobar.md`

But by adding a shebang at the top we can run it without having to tell Linux to use Ruby.

#!/home/path-to-ruby/ruby
puts "Hello World!"

# To run this file you can simply use `foobar.md`

How to ignore a shebang

If your file has a hashbang but you want to run it with an alternative program then you can run it in the usual way and the hashbang will be ignored. This works because many programs will consider the hash to be a comment

Absolute paths are required with shebangs

Note how in the example above we had to use #!/home/path-to-ruby/ruby and not just #!ruby. This has an impact on portability because on a different machine ruby might be in a different path.