code: func SourceNode(ctx context.Context, node syntax.Node) (map[string]expand.Variable, error) {
  	r, _ := interp.New()
  	if err := r.Run(ctx, node); err != nil {
  		return nil, fmt.Errorf("could not run: %v", err)
  	}
  	// delete the internal shell vars that the user is not
  	// interested in
  	delete(r.Vars, "PWD")
  	delete(r.Vars, "HOME")
  	delete(r.Vars, "PATH")
  	delete(r.Vars, "IFS")
  	delete(r.Vars, "OPTIND")
  	return r.Vars, nil
  }
docs: // SourceNode sources a shell program from a node and returns the
  // variables declared in it. It accepts the same set of node types that
  // interp/Runner.Run does.
  //
  // This function should be used with caution, as it can interpret arbitrary
  // code. Untrusted shell programs shoudn't be sourced outside of a sandbox
  // environment.