$foo fi # while 文 while [ $foo -le 10 ]; do echo $foo foo=`expr $foo + 1` done # for文 for foo in a b c; do echo $foo done 10 自作シェルについて bashとRubyは構文が似ている # if文 if foo == "bar" then puts foo end # while文 while foo <= 10 do puts foo foo += 1 end # for文 for foo in %w[a b c] do puts foo end bash Ruby if ~ then ~ fi/end while ~ do ~ done/end for ~ do ~ done/end
search_command(command) Exec.execv(cmd, *args) end def search_command(command) return command if command.include?("/") paths = ENV["PATH"].split(":") .map{|p| "#{p}/#{command}"} result = paths.find{|p| File.exists?(p)} return result || command end (右に続く) シェルの実装 mrubyでシェルを作る 今までのコードを組み合わせて mrblib/myshell.rbに追加する。 def __main__(argv) while (line = linenoise("shell> ")) unless line.empty? exec_command(line) end end end
'mruby-env' spec.add_dependency 'mruby-process' 👈 end def __main__(argv) while (line = linenoise("shell> ")) unless line.empty? # forkして子プロセスを生成する 👈 pid = Process.fork do 👈 exec_command(line) 👈 end 👈 # 子プロセスの終了を待つ 👈 Process.waitpid(pid) 👈 end end end