def _Exec(self, argv): # Either execute command with redirects, or apply redirects in this shell. # NOTE: Redirects were processed earlier. if argv: environ = self.mem.GetExported() process.ExecExternalProgram(argv, environ) # never returns else: return 0
def _RunSimpleCommand(self, argv, fork_external, span_id, funcs=True): """ Args: fork_external: for subshell ( ls / ) or ( command ls / ) """ # This happens when you write "$@" but have no arguments. if not argv: return 0 # status 0, or skip it? arg0 = argv[0] builtin_id = builtin.ResolveSpecial(arg0) if builtin_id != builtin_e.NONE: try: status = self._RunBuiltin(builtin_id, argv, span_id) except args.UsageError as e: ui.usage('osh %r usage error: %s', arg0, e) status = 2 # consistent error code for usage error return status # Builtins like 'true' can be redefined as functions. if funcs: func_node = self.funcs.get(arg0) if func_node is not None: # NOTE: Functions could call 'exit 42' directly, etc. status = self._RunFunc(func_node, argv[1:]) return status builtin_id = builtin.Resolve(arg0) if builtin_id == builtin_e.COMMAND: # 'command ls' suppresses function lookup n = len(argv) if n == 1: return 0 # 'command', like the 'if not argv' case above # The 'command' builtin syntax is simple enough that this is 100% # correct, not a heuristic. elif n >= 2 and argv[1] != '-v': return self._RunSimpleCommand(argv[1:], fork_external, span_id, funcs=False) if builtin_id != builtin_e.NONE: try: status = self._RunBuiltin(builtin_id, argv, span_id) except args.UsageError as e: ui.usage('osh %r usage error: %s', arg0, e) status = 2 # consistent error code for usage error return status environ = self.mem.GetExported() # Include temporary variables if fork_external: thunk = process.ExternalThunk(argv, environ) p = process.Process(thunk) status = p.Run(self.waiter) return status # NOTE: Never returns! process.ExecExternalProgram(argv, environ)
def _RunSimpleCommand(self, argv, fork_external): # This happens when you write "$@" but have no arguments. if not argv: return 0 # status 0, or skip it? arg0 = argv[0] builtin_id = builtin.ResolveSpecial(arg0) if builtin_id != builtin_e.NONE: try: status = self._RunBuiltin(builtin_id, argv) except args.UsageError as e: # TODO: Make this message more consistent? util.usage(str(e)) status = 2 # consistent error code for usage error return status # Builtins like 'true' can be redefined as functions. func_node = self.funcs.get(arg0) if func_node is not None: # NOTE: Functions could call 'exit 42' directly, etc. status = self.RunFunc(func_node, argv) return status builtin_id = builtin.Resolve(arg0) if builtin_id != builtin_e.NONE: try: status = self._RunBuiltin(builtin_id, argv) except args.UsageError as e: # TODO: Make this message more consistent? util.usage(str(e)) status = 2 # consistent error code for usage error return status environ = self.mem.GetExported() # Include temporary variables if fork_external: thunk = process.ExternalThunk(argv, environ) p = process.Process(thunk) status = p.Run(self.waiter) return status # NOTE: Never returns! process.ExecExternalProgram(argv, environ)