Chaque fois que j'exécute un script en utilisant bash scriptname.sh
à partir de la ligne de commande dans Debian, je reçois 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 à partir du dossier /var
.
Voici le script:
#!/bin/bash
echo Hello World
Je le lance en tapant ce qui suit:
bash testscript.sh
UPDATE - le problème apparaît sur les lignes vierges. Chaque ligne vide entraîne une commande introuvable. Pourquoi cela se produirait-il?
Assurez-vous que votre première ligne est:
#!/bin/bash
Entrez votre chemin d'accès à bash si ce n'est pas /bin/bash
Essayez de courir:
dos2unix script.sh
Cela convertira les fins de ligne, etc. de Windows au format Unix. c’est-à-dire qu’il supprime\r (CR) des fins de ligne pour les changer de \r\n (CR+LF)
à \n (LF)
.
Plus de détails sur la commande dos2unix
(page de manuel)
Une autre façon de savoir si votre fichier est au format dos/Win:
cat scriptname.sh | sed 's/\r/<CR>/'
La sortie ressemblera à ceci:
#!/bin/sh<CR>
<CR>
echo Hello World<CR>
<CR>
Cela produira le texte entier du fichier avec <CR>
affiché pour chaque caractère \r
du fichier.
Vous pouvez utiliser bash -x scriptname.sh
pour le tracer.
J'ai aussi rencontré un problème similaire. Le problème semble être les autorisations. Si vous faites un ls -l
, vous pourrez peut-être identifier le bit d’exécution activé dans votre fichier. Cela ne permettra PAS au script de s'exécuter. :)
Comme @artooro ajouté dans le commentaire:
Pour résoudre ce problème, lancez
chmod +x testscript.sh
Si le script fait (relativement) bien son travail, alors il fonctionne bien. Votre problème est probablement une simple ligne dans le fichier référençant un programme qui n'est pas sur le chemin, qui n'est pas installé, mal orthographié ou similaire.
Une solution consiste à placer un set -x
en haut de votre script ou à l'exécuter avec bash -x
au lieu de simplement bash
- ceci affichera les lignes avant de les exécuter et il vous suffira généralement de regarder à la sortie de la commande immédiatement avant l'erreur pour voir ce qui cause le problème
Si, comme vous le dites, ce sont les lignes vierges qui posent problème, vous pouvez vérifier ce qui est réellement en les. Courir:
od -xcb testscript.sh
et assurez-vous qu'il n'y a pas de personnages amusants "invisibles" comme le CTRL-M
(retour chariot) que vous pourriez obtenir en utilisant un éditeur de type Windows.
utilisez dos2unix
sur votre fichier de script.
Si vous avez Notepad ++ et que vous obtenez ce message d'erreur .sh: "commande introuvable" .__ ou ce message d'erreur autoconf "ligne 615: ../../autoconf/bin/autom4te: Aucun fichier ou répertoire de ce nom" .
Sur votre bloc-notes ++, allez dans Éditer -> Conversion EOL puis vérifiez Macinthos (CR) . Cela modifiera vos fichiers. J'encourage également à vérifier tous les fichiers avec cette commande, .__, car une telle erreur se produira bientôt.
pour l'exécution que vous devez fournir le chemin complet de cette par exemple
/home/Manuel/mywrittenscript
Essayez chmod u+x testscript.sh
Je le sais par ici: http://www.linuxquestions.org/questions/red-hat-31/running-Shell-script-command-not-found202062/
Cela peut sembler trivial et ne pas être lié à la question du PO, mais je me suis souvent trompé au début de mon apprentissage du script
VAR_NAME = $(hostname)
echo "the hostname is ${VAR_NAME}"
Cela produira une réponse 'commande non trouvée'. La bonne façon est d'éliminer les espaces
VAR_NAME=$(hostname)
Avait le même problème. Malheureusement
dos2unix winfile.sh
bash: dos2unix: command not found
alors j'ai fait ça pour convertir.
awk '{ sub("\r$", ""); print }' winfile.sh > unixfile.sh
et alors
bash unixfile.sh
Les problèmes d'exécution de scripts peuvent également être liés à un formatage incorrect des commandes multilignes, par exemple si vous avez un caractère d'espacement après la fin de ligne "\". Par exemple. ce:
./run_me.sh \
--with-some parameter
(veuillez noter que l'espace supplémentaire après "\") posera problème, mais si vous supprimez cet espace, il fonctionnera parfaitement.
Sur Bash pour Windows, j'ai mal essayé de m'exécuter
run_me.sh
sans ./ au début et a la même erreur.
Pour les personnes ayant des antécédents Windows, le formulaire approprié semble redondant:
./run_me.sh
Je me suis heurté à cela aujourd'hui, copiant distraitement la commande dollar Prompt $
(devant une chaîne de commande) dans le script.
J'avais aussi une partie du Cannot execute command
. Tout semblait correct, mais en fait, j'avais un espace non cassable
juste avant ma commande, ce qui était bien sûr impossible à repérer à l'œil nu:
if [[ "true" ]]; then
highlight --syntax js "var i = 0;"
fi
Qui, dans Vim, ressemblait à:
if [[ "true" ]]; then
highlight --syntax js "var i = 0;"
fi
Après avoir exécuté le vérificateur de script Bash shellcheck
, j'ai trouvé le problème.
Ajoutez le répertoire en cours (.) À PATH pour pouvoir exécuter un script, en tapant simplement son nom, qui réside dans le répertoire en cours:
PATH=.:$PATH
Vous voudrez peut-être mettre à jour vos fichiers .bashrc et .bash_profile avec des alias pour reconnaître la commande que vous entrez.
Les fichiers .bashrc et .bash_profile sont des fichiers cachés situés probablement sur votre lecteur C: où vous enregistrez vos fichiers de programme.