···4949 | Command of { print_command : bool; args : string list }
5050 | Alias
5151 | Unalias
5252+ | Eval of string list
52535354(* Change Directory *)
5455module Cd = struct
···235236 Cmd.v info term
236237end
237238239239+module Eval = struct
240240+ open Cmdliner
241241+242242+ let args =
243243+ let doc = "Arguments to concatenate, parse and execute." in
244244+ Arg.(value & pos_all string [] & info [] ~docv:"ARGS" ~doc)
245245+246246+ let t =
247247+ let make_eval args = Eval args in
248248+ let term = Term.(const make_eval $ args) in
249249+ let info =
250250+ let doc = "Construct a command by concatenating arguments together." in
251251+ Cmd.info "eval" ~doc
252252+ in
253253+ Cmd.v info term
254254+end
255255+238256module Source = Make_dot (struct
239257 let name = "source"
240258end)
···266284 | "command" :: _ as cmd -> exec_cmd cmd Command.t
267285 | "alias" :: _ -> Some (Ok Alias)
268286 | "unalias" :: _ -> Some (Ok Unalias)
287287+ | "eval" :: _ as cmd -> exec_cmd cmd Eval.t
269288 | _ -> None
+1
src/lib/built_ins.mli
···2626 | Command of { print_command : bool; args : string list }
2727 | Alias
2828 | Unalias
2929+ | Eval of string list
29303031val of_args : string list -> (t, string) result option
3132(** Parses a command-line to the built-ins, errors are returned if parsing. *)
···436436 match job with
437437 | None -> Exit.zero ctx
438438 | Some job ->
439439- if not async then J.await_exit ~pipefail:false job >|= fun () -> ctx
439439+ if not async then begin
440440+ J.await_exit ~pipefail:false job >|= fun () -> ctx
441441+ end
440442 else begin
441443 Exit.zero { ctx with background_jobs = job :: ctx.background_jobs }
442444 end
···890892 Exit.zero ctx
891893 | _ -> assert false)
892894 | Alias | Unalias -> Exit.zero ctx (* Morbig handles this for us *)
895895+ | Eval args ->
896896+ let script = String.concat " " args in
897897+ let ast = Ast.of_string script in
898898+ let ctx, _ = run (Exit.zero ctx) ast in
899899+ ctx
893900 | Command _ ->
894901 (* Handled separately *)
895902 assert false