Bash script imprime toujours la commande "Not Found""
chaque fois que j'exécute un script en utilisant bash scriptname.sh
depuis la ligne de commande dans Debian, j'obtiens Command Not found
puis le résultat du script. Donc le script fonctionne mais il y a toujours une déclaration Command Not Found
imprimée à l'écran.
j'exécute le script depuis le dossier /var
.
voici le script:
#!/bin/bash
echo Hello World
Je l'exécute en tapant ce qui suit:
bash testscript.sh
mise à jour-le problème apparaît à des lignes vides. Chaque ligne vide entraîne une commande introuvable. Pourquoi en serait-il de se produire?
16 réponses
assurez-vous que votre première ligne est:
#!/bin/bash
entrez votre chemin vers bash si ce n'est pas /bin/bash
Essayez de lancer:
dos2unix script.sh
qui convertira les fins de ligne, etc de Windows au format unix. c'est-à-dire qu'il retire \R (CR) des fins de ligne pour les changer de \r\n (CR+LF)
à \n (LF)
.
plus de détails sur le dos2unix
commande (page de manuel)
une Autre façon de savoir si votre fichier est dans le dos/Win format:
cat scriptname.sh | sed 's/\r/<CR>/'
la sortie ressemblera à quelque chose comme ceci:
#!/bin/sh<CR>
<CR>
echo Hello World<CR>
<CR>
ceci affichera le texte complet du fichier avec <CR>
affiché pour chaque caractère \r
dans le fichier.
j'ai également rencontré un problème similaire. Le problème semble être autorisations. Si vous faites un ls -l
, vous pourriez être en mesure d'identifier que votre fichier peut ne pas avoir le bit d'exécution activé. Cela ne permettra pas au script de s'exécuter. :)
comme @artooro a ajouté dans le commentaire:
pour corriger cette question, Lancez
chmod +x testscript.sh
si le script fait son travail (relativement) bien, alors il tourne bien. Votre problème est probablement une seule ligne dans le fichier référençant un programme qui n'est pas sur le chemin, pas installé, mal orthographié, ou quelque chose de similaire.
une façon est de placer un set -x
en haut de votre script ou de l'exécuter avec bash -x
au lieu de juste bash
- cela va sortir les lignes avant de les exécuter et vous avez habituellement juste besoin de regarder la sortie de commande immédiatement avant l'erreur pour voir ce qui cause le problème
si, comme vous dites, ce sont les lignes vierges qui causent les problèmes, vous pourriez vouloir vérifier ce qui est actaully dans eux. Exécuter:
od -xcb testscript.sh
et assurez-vous qu'il n'y a pas de caractères" invisibles "comme le CTRL-M
(retour chariot) que vous pouvez obtenir en utilisant un éditeur de type Windows.
si vous avez Notepad++ et que vous avez ceci .message d'erreur sh: "commande introuvable" ou ce Message d'erreur autoconf " ligne 615: ../../autoconf/bin / autom4te: No such file or directory" .
sur votre bloc-notes++, allez à Edit - > Conversion EOL puis cochez Macinthos(CR) . Ceci modifiera vos fichiers. J'encourage également à vérifier tous les fichiers avec cette commande, parce que bientôt, une telle erreur se produit.
Essayer chmod u+x testscript.sh
je le sais d'ici: http://www.linuxquestions.org/questions/red-hat-31/running-shell-script-command-not-found-202062 /
pour exécuter que vous devez fournir le chemin complet de ce par exemple
/home/Manuel/mywrittenscript
Avait le même problème. Malheureusement
dos2unix winfile.sh
bash: dos2unix: command not found
alors j'ai fait ça pour me convertir.
awk '{ sub("\r$", ""); print }' winfile.sh > unixfile.sh
et puis
bash unixfile.sh
les problèmes avec les scripts en cours d'exécution peuvent aussi être connectés à un mauvais formatage des commandes multi-lignes, par exemple si vous avez un caractère d'espace après la rupture de ligne"\". Par exemple: ceci:
./run_me.sh \
--with-some parameter
(s'il vous plaît noter l'espace supplémentaire après"\") va causer des problèmes, mais quand vous retirez cet espace, il fonctionnera parfaitement.
c'est peut-être trivial et sans rapport avec la question de L'OP, mais j'ai souvent fait cette erreur au début quand j'apprenais les scripts
VAR_NAME = $(hostname)
echo "the hostname is ${VAR_NAME}"
cela produira la réponse "commande non trouvée". La bonne façon est d'éliminer les espaces
VAR_NAME=$(hostname)
j'ai été aussi avoir une partie de la Cannot execute command
. Tout avait l'air correct, mais en fait j'avais un espace non-cassable
juste avant mon ordre qui était naturellement impossible à repérer à l'oeil nu:
if [[ "true" ]]; then
highlight --syntax js "var i = 0;"
fi
qui, à Vim, ressemblait à:
if [[ "true" ]]; then
highlight --syntax js "var i = 0;"
fi
ce n'est qu'après avoir lancé le vérificateur de script Bash shellcheck
que j'ai trouvé le problème.
Ajouter le répertoire courant ( . ) au chemin pour pouvoir exécuter un script, en tapant simplement son nom, qui réside dans le répertoire courant:
PATH=.:$PATH
je suis tombé sur ceci aujourd'hui, en copiant sans réfléchir l'invite de commande $
(devant une chaîne de commande) dans le script.
Sur le coup pour Windows j'ai essayé de mal à exécuter
run_me.sh
sans ./ au début et a eu la même erreur.
pour les personnes avec Windows background la forme correcte semble redondant:
./run_me.sh
vous pouvez vouloir vous mettre à jour .bashrc et .bash_profile fichiers avec des alias pour reconnaître la commande que vous entrez.
.bashrc et .bash_profile fichiers sont cachés probablement situé sur votre lecteur C: où vous enregistrez vos fichiers de programme.