diff --git a/src/fsh.nim b/src/fsh.nim index 417cd32..d471449 100644 --- a/src/fsh.nim +++ b/src/fsh.nim @@ -18,10 +18,11 @@ for k, v in envPairs(): envVariables[k]=v # list of builtin commands -let builtins: array[3, string] = [ +let builtins: array[4, string] = [ "set", "setenv", "echo", +"exit", ] # forward declarations @@ -214,6 +215,25 @@ proc runBuiltin(builtin: string, args: openArray[string]): string = if args[0] == "-n": return args[1..^1].join(" ") return args.join(" ") & "\p" + of "exit": + if args.len == 0: + quit(0) + elif args.len == 1: + try: + quit(args[0].parseInt) + except ValueError: + quit(0) + else: + try: + let exitcode=args[0].parseInt + if exitcode > 0: + stderr.write(args[1..^1].join(" "), "\p") + else: + stdout.write(args[1..^1].join(" "), "\p") + quit(exitcode) + except ValueError: + stdout.write(args.join(" "), "\p") + quit(0) else: raise newException(Exception, "Fsh: No such builtin implemented")