Yarsh

Yet Another Ruby SHell is a mix of Ruby and standard Shell REPL. Priority is given to Ruby but if the variable or method is not found or if it is a syntax error, it will be passed to the default shell environment. It enable the best of both worlds, the power of ruby and the simplicity of the standard Shell.

This project was made just for fun, to remember the basis of Ruby and to discover new features. To provide a good user experience, it uses reline under the hood which already implement all we want for a REPL: History, completion, etc.

I wanted a simple version but already working version. If I have time, more features will come. For example, multi-line editing or non interactive with a file as argument. I dream of a shell syntax we can do:

def install_rails
  sudo apt update
  sudo apt install ruby
  gem install rails
end

install_rails

I developed this project half of the time offline, another part with the help of AI. It was a way for me to try to develop with AI. I used opencode with DeepSeek V4 Flash Free.

Usage

yarsh start the shell.

Features

Use it as a normal shell, except that you can use Ruby commands and methods. For example:

puts "Hello World! We can use Ruby or standard shell:"
Dir["**/*.rb"].each { |file| puts file }
puts "Or shell like:"
find . -name  "*.rb" -print

For the moment, it display ruby evaluation results with pretty_print.

Special keyword for mixing

You can also mix both with the special keyword -->. It will pass to ruby the result of the shell command to use in Ruby. For example:

ls -al . --> lines.each { |file| puts file }

the result of the exectued shell command is ExecOutput a subclass of String with some extra methods. For the moment, it has:

  • #lines
  • #words

You want to store the result of the ruby evaluation after a shell command? Use -->(varible_name). For example:

ls -al . -->(sorted) lines.sort {|a, b| a.length <=> b.length  }
sorted.each { |file| puts "What ever you wanna do" }

Completion

For the moment, there is autocompletion for exectuables in PATH and for file and dir path for shell commands

Errors

$rberr are set for every catched Ruby error.

$sherr are set for every catched Shell error.

Configuration

You can create a file named config in ~/.yarsh. It is plain ruby, for now, you can define aliases for shell commands, define methods that will be available in the REPL, configure the prompt looks like and some logging. Here is an example file:


sh_alias 'ls', 'exa -l --icons=always'
sh_alias 'll', 'ls -a' # Will be expanded to exa -l --icons=always -a

configure do |c|
  c.prompt = :powerline # To available prompt: :powerline or :basic
  # Or define how your own logic for the prompt. Should return a string
  c.prompt = Proc.new do
    "hello> "
  end
  c.log_level = Logger::DEBUG # Lot of unuseful lines
end

# Will be available in the REPL once the related TODO is completed
def my_awsome_method
  puts "Hello World"
end

Development

After checking out the repo, run bin/setup to install dependencies. Then, run bundle exec rake test to run the tests. You can also run bin/console for an interactive prompt that will allow you to experiment.

To install this gem onto your local machine, run bundle exec rake install. To release a new version, update the version number in version.rb, and then run bundle exec rake release, which will create a git tag for the version, push git commits and the created tag, and push the .gem file to rubygems.org.

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/facenord-sud/yarsh.