123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- package eval
- import (
- "os"
- "os/exec"
- "src.elv.sh/pkg/eval/errs"
- )
- // Command and process control.
- // TODO(xiaq): Document "fg".
- func init() {
- addBuiltinFns(map[string]any{
- // Command resolution
- "external": external,
- "has-external": hasExternal,
- "search-external": searchExternal,
- // Process control
- "fg": fg,
- "exec": execFn,
- "exit": exit,
- })
- }
- func external(cmd string) Callable {
- return NewExternalCmd(cmd)
- }
- func hasExternal(cmd string) bool {
- _, err := exec.LookPath(cmd)
- return err == nil
- }
- func searchExternal(cmd string) (string, error) {
- return exec.LookPath(cmd)
- }
- // Can be overridden in tests.
- var osExit = os.Exit
- func exit(fm *Frame, codes ...int) error {
- code := 0
- switch len(codes) {
- case 0:
- case 1:
- code = codes[0]
- default:
- return errs.ArityMismatch{What: "arguments", ValidLow: 0, ValidHigh: 1, Actual: len(codes)}
- }
- fm.Evaler.PreExit()
- osExit(code)
- return nil
- }
|