I got nerd sniped on Twitter!
Originally the prompt was to do the installing of the interpretter in the shebang, but I was able to fit it all in one file and that felt close enough.
| #!/usr/bin/env RBENV_VERSION=3.1.2 HAHA=ruby bash | |
| ## Our first hack is right over here ^^^^ | |
| ## The ruby cli won't run a file with a shebang, UNLESS the shebang | |
| ## contains the string 'ruby' somewhere in it. Here we are using it as the value | |
| ## of the HAHA environment variable. This is enough to get Ruby to run the file. | |
| ## The next line is doing double duty! It needs to be valid Ruby AND Bash | |
| ## In Ruby this is going to start a multiline comment (which will end at the `=end` below) | |
| ## In Bash this is going to create a `=begin` function that no-ops. [We won't ever call this function] | |
| =begin () { :; } | |
| ## Now we are in a Ruby comment, and still executing normal Bash. So the following only needs to be valid Bash | |
| ## Let's make sure Ruby is installed. We'll do that via `rbenv` and `ruby-build` | |
| set -e | |
| export PATH="$HOME/.rbenv/bin:$PATH" | |
| if ! hash rbenv 2> /dev/null; then | |
| mkdir -p ~/.rbenv | |
| curl -L https://github.com/rbenv/rbenv/tarball/master | tar -xz -C ~/.rbenv --strip-components=1 | |
| mkdir -p ~/.rbenv/plugins/ruby-build | |
| curl -L https://github.com/rbenv/ruby-build/tarball/master | tar -xz -C ~/.rbenv/plugins/ruby-build --strip-components=1 | |
| fi | |
| eval "$(rbenv init - bash)" | |
| rbenv install $RBENV_VERSION --skip-existing | |
| ## Now that we have Ruby installed at the version we specified, lets run our script in Ruby! We capture the exit code to return | |
| ruby $(which $0) | |
| exit $? | |
| ## After ^^ the Bash script exits, so we no longer need to be valid Bash! | |
| =end | |
| ## We are out of our Multiline comment, and all done with Bash, so now we can proceed with the Ruby script | |
| def hello(name:) | |
| puts "Hello #{name}. We are running Ruby #{RUBY_VERSION}" | |
| end | |
| name = "World" | |
| ## And _finally_ we are ready to use some new Ruby 3.1 syntax! | |
| hello(name:) |
| #!/usr/bin/env RBENV_VERSION=3.1.2 HAHA=ruby bash | |
| =begin () { :; } | |
| export PATH="$HOME/.rbenv/bin:$PATH" | |
| if ! hash rbenv 2> /dev/null; then | |
| mkdir -p ~/.rbenv; curl -L https://github.com/rbenv/rbenv/tarball/master | tar -xz -C ~/.rbenv --strip-components=1 | |
| mkdir -p ~/.rbenv/plugins/ruby-build | |
| curl -L https://github.com/rbenv/ruby-build/tarball/master | tar -xz -C ~/.rbenv/plugins/ruby-build --strip-components=1 | |
| fi | |
| eval "$(rbenv init - bash)"; rbenv install $RBENV_VERSION -s; ruby $(which $0); exit $? | |
| =end | |
| def hello(name:) | |
| puts "Hello #{name}. We are running Ruby #{RUBY_VERSION}" | |
| end | |
| name = "World" | |
| hello(name:) |