Pas en mesure d'exécuter le fichier aller utilisant os/exec paquet
Je suis à la suite de la golang tutoriel pour l'écriture de mon application web. Je suis modifiant le code de page du tutoriel, afin que je puisse exécuter la page enregistrée comme code (similaire à aller de l'aire de jeux). Mais quand j'essaie d'exécuter l'sauvé go de fichiers à l'aide de la os/exec
paquet, il jette l'erreur suivante.
exec: "aller courir testcode.aller": fichier exécutable ne trouve pas dans $PATH
Voici mon code modifié :
//Structure to hold the Page
type Page struct {
Title string
Body []byte
Output []byte
}
//saving the page
func (p *Page) save() { //difference between func (p *Page) and func (p Page)
filename := p.Title + ".go"
ioutil.WriteFile(filename, p.Body, 0777)
}
//handle for the editing
func editHandler(w http.ResponseWriter, r *http.Request) {
title := r.URL.Path[len("/edit/"):]
p, err := loadPage(title)
if err != nil {
p = &Page{Title: title}
}
htmlTemp, _ := template.ParseFiles("edit.html")
htmlTemp.Execute(w, p)
}
//saving the page
func saveHandler(w http.ResponseWriter, r *http.Request) {
title := r.URL.Path[len("/save/"):]
body := r.FormValue("body")
p := Page{Title: title, Body: []byte(body)}
p.save()
http.Redirect(w, r, "/exec/"+title, http.StatusFound) //what is statusfound
}
//this function will execute the code.
func executeCode(w http.ResponseWriter, r *http.Request) {
title := r.URL.Path[len("/exec/"):]
cmd := "go run " + title + ".go"
//cmd = "go"
fmt.Print(cmd)
out, err := exec.Command(cmd).Output()
if err != nil {
fmt.Print("could not execute")
fmt.Fprint(w, err)
} else {
p := Page{Title: title, Output: out}
htmlTemp, _ := template.ParseFiles("output.html")
htmlTemp.Execute(w, p)
}
}
S'il vous plaît dites-moi pourquoi je ne peux pas en mesure d'exécuter le fichier aller.
OriginalL'auteur subhash kumar singh | 2014-12-12
Vous devez vous connecter pour publier un commentaire.
Vous êtes en invoquant la commande dans le mauvais sens. La première chaîne est le chemin complet de l'exécutable
os.exec.Commande:
func Command(name string, arg ...string)
donc, vous voulez
exec.Command("/usr/bin/go", "run", title+".go")
fork/exec /usr/local/go/bin/go run ABSOLUTE_PATH/testcode.go: no such file or directory
. Allez fichier est créé et visible dans l'annuaire, je suis en mesure d'exécuter le programme (testcode.aller) à partir du terminal.depuis le terminal avec les mêmes cordes ? accédez au répertoire / root, et essayez d'exécuter votre fichier à partir de là
Oui à l'aide de la
/usr/local/go/bin/go run ABSOLUTE_PATH/testcode.go
depuis le terminal.Désolé de mon erreur, il est de travail.!! merci!
oh bonne qui travaille maintenant 🙂
OriginalL'auteur fabrizioM
La accepté de répondre à dit que le premier argument de os.exec.Commande est le chemin complet de l'exécutable. À partir de la documentation:
"Si le nom contient pas de séparateurs de chemin, Commande utilise LookPath pour résoudre le chemin d'accès complet et le nom si possible. Sinon, il utilise directement le nom d'".
Ce que vous devriez faire pour éviter les
executable file not found in $PATH
erreurs, en plus de passer les arguments après le nom de l'exécutable, comme proposé précédemment, est de définir vosPATH
soit dans votre SHELL ou à l'aide de os.Setenv. Si vous coder en dur l'emplacement complet de la commande comme indiqué, votre programme peut ne pas être transférables à un autre système d'exploitation Unix.Par exemple, la commande
lspci
est situé sous/usr/bin
dans ubuntu et sous/sbin/
dans RHEL. Si vous faites cela:Alors votre programme sera exécution dans les deux ubuntu et RHEL.
Ou, de la forme de la coquille, vous pouvez également le faire:
PATH=/sbin; my_program
REMARQUE: Les commandes ci-dessus sont la limitation de la
PATH
à l'indique de façon explicite les chemins d'accès. Si vous souhaitez ajouter le chemin d'accès existant dans le shell par exemple, nePATH=/sbin:$PATH; my_program
; En aller, vous pouvez le lire sans doute la variable avecos.Getenv
puis d'en ajouter pour que lors de laos.Setenv
.PATH
variable d'environnement comme vous le suggérez).Si vous exécutez des scripts en tant que root, il est important de limiter la
PATH
pour éviter les problèmes de sécurité. J'ai édité ma réponse à reconnaître ce que vous avez apporté.Oui, mais votre executable pas être marinage avec le chemin d'accès. L'OP était en cours d'exécution
go
, vous ne savez pas où c'est (est-il/usr/local/bin/go
?, est-il/opt/go/bin
?, est-il$HOME/go1.5/bin
?, etc) alors vous devez simplement laisser la fixation d'un sane chemin d'accès de l'utilisateur; il suffit d'essayer et d'exécuter une commande en tant quego
qui utiliseraLookPath
et à se plaindre de manière appropriée si elle ne trouve pas. En limitant le chemin d'accès ne devrait pas être le travail d'un aléatoire programme (à moins que peut-être si c'est un cas spécial de quelque chose setuid mais c'est une toute autre boîte de pandore).OriginalL'auteur DavidG