package command import ( "bbash/command/cat" "bbash/command/cd" "bbash/command/cp" "bbash/command/echo" "bbash/command/head" "bbash/command/help" "bbash/command/ls" "bbash/command/man" "bbash/command/mv" "bbash/command/pwd" "bbash/command/rm" "bbash/command/touch" "bbash/environment" "bbash/input_parser" "fmt" "os" "strings" ) var path_command []string func Init(env *environment.Env) { init_path(env) } func Run_command(in input_parser.Input, env *environment.Env) { switch in.Instruction { case "pwd": pwd.Pwd(in, env) case "echo": echo.Echo(in, env) case "ls": ls.Ls(in, env) case "cd": cd.Cd(in, env) case "man": man.Man(in, env) case "cat": cat.Cat(in, env) case "head": head.Head(in, env) case "touch": touch.Touch(in, env) case "rm": rm.Rm(in, env) case "cp": cp.Cp(in, env) case "mv": mv.Mv(in,env) case "help": help.Help(in,env) default: if !run_by_path(in, env) { fmt.Println(fmt.Sprintf("No such command! (%s)", in.Instruction)) } } } // Returns if anything was run or not func run_by_path(in input_parser.Input, env *environment.Env) bool { fmt.Print(env.Env["PATH"]) return false } func init_path(env *environment.Env) { path := strings.Split(env.Env["PATH"], ":") for _, a_path := range path { recursive_executable_finder(a_path) } } func recursive_executable_finder(path string) { dir, err := os.ReadDir(path) if err != nil { return } for _, f := range dir { if f.IsDir() { recursive_executable_finder(f.Name()) continue } if !is_executable(f.Name()) { println("not exec") continue } println(f.Name()) path_command = append(path_command, f.Name()) } } func is_executable( name string) bool { return true stat, _ := os.Stat(name) mode := stat.Mode() return mode&(1<<0) != 0 || // Others' execute bit mode&(1<<3) != 0 || // Group's execute bit mode.Perm()&(1<<6) != 0 // Owner's execute bit }