package eval
import (
)
var (
ErrExternalCmdOpts = errors.New("external commands don't accept elvish options")
ErrImplicitCdNoArg = errors.New("implicit cd accepts no arguments")
)
type externalCmd struct {
Name string
}
func ( string) Callable {
return externalCmd{}
}
func ( externalCmd) () string {
return "fn"
}
func ( externalCmd) ( interface{}) bool {
return ==
}
func ( externalCmd) () uint32 {
return hash.String(.Name)
}
func ( externalCmd) (int) string {
return "<external " + parse.Quote(.Name) + ">"
}
func ( externalCmd) ( *Frame, []interface{}, map[string]interface{}) error {
if len() > 0 {
return ErrExternalCmdOpts
}
if fsutil.DontSearch(.Name) {
, := os.Stat(.Name)
if == nil && .IsDir() {
if len() > 0 {
return ErrImplicitCdNoArg
}
return .Evaler.Chdir(.Name)
}
}
:= make([]*os.File, len(.ports))
for , := range .ports {
if != nil {
[] = .File
}
}
:= make([]string, len()+1)
for , := range {
[+1] = vals.ToString()
}
, := exec.LookPath(.Name)
if != nil {
return
}
[0] =
:= makeSysProcAttr(.background)
, := os.StartProcess(, , &os.ProcAttr{Files: , Sys: })
if != nil {
return
}
, := .Wait()
if != nil {
return
}
return NewExternalCmdExit(.Name, .Sys().(syscall.WaitStatus), .Pid)
}