@@ -0,0 +1,59 @@
1+package shell
2+
3+import (
4+ "context"
5+
6+ "github.com/u-root/u-root/pkg/core"
7+ "github.com/u-root/u-root/pkg/core/cat"
8+ "github.com/u-root/u-root/pkg/core/chmod"
9+ "github.com/u-root/u-root/pkg/core/cp"
10+ "github.com/u-root/u-root/pkg/core/find"
11+ "github.com/u-root/u-root/pkg/core/ls"
12+ "github.com/u-root/u-root/pkg/core/mkdir"
13+ "github.com/u-root/u-root/pkg/core/mv"
14+ "github.com/u-root/u-root/pkg/core/rm"
15+ "github.com/u-root/u-root/pkg/core/touch"
16+ "github.com/u-root/u-root/pkg/core/xargs"
17+ "mvdan.cc/sh/v3/interp"
18+)
19+
20+var coreUtils = map[string]func() core.Command{
21+ "cat": func() core.Command { return cat.New() },
22+ "chmod": func() core.Command { return chmod.New() },
23+ "cp": func() core.Command { return cp.New() },
24+ "find": func() core.Command { return find.New() },
25+ "ls": func() core.Command { return ls.New() },
26+ "mkdir": func() core.Command { return mkdir.New() },
27+ "mv": func() core.Command { return mv.New() },
28+ "rm": func() core.Command { return rm.New() },
29+ "touch": func() core.Command { return touch.New() },
30+ "xargs": func() core.Command { return xargs.New() },
31+}
32+
33+func (s *Shell) coreUtilsHandler() func(next interp.ExecHandlerFunc) interp.ExecHandlerFunc {
34+ return func(next interp.ExecHandlerFunc) interp.ExecHandlerFunc {
35+ return func(ctx context.Context, args []string) error {
36+ if len(args) == 0 {
37+ return next(ctx, args)
38+ }
39+
40+ program, programArgs := args[0], args[1:]
41+
42+ newCoreUtil, ok := coreUtils[program]
43+ if !ok {
44+ return next(ctx, args)
45+ }
46+
47+ c := interp.HandlerCtx(ctx)
48+
49+ cmd := newCoreUtil()
50+ cmd.SetIO(c.Stdin, c.Stdout, c.Stderr)
51+ cmd.SetWorkingDir(c.Dir)
52+ cmd.SetLookupEnv(func(key string) (string, bool) {
53+ v := c.Env.Get(key)
54+ return v.Str, v.Set
55+ })
56+ return cmd.RunContext(ctx, programArgs...)
57+ }
58+ }
59+}