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?

81
demandé sur codeforester 2011-09-09 17:39:21

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.

129
répondu chown 2018-03-07 05:59:44

vous pouvez utiliser bash -x scriptname.sh pour le tracer.

42
répondu clyfish 2011-09-10 07:15:08

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

34
répondu Lypso345 2016-09-07 13:29:00

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.

10
répondu paxdiablo 2011-09-09 14:04:23

utilisez dos2unix dans votre script.

6
répondu bash-o-logist 2011-09-09 14:05:27

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.

5
répondu Juniar 2017-08-03 21:38:42
4
répondu Aminah Nuraini 2016-01-15 02:21:53

pour exécuter que vous devez fournir le chemin complet de ce par exemple

/home/Manuel/mywrittenscript
4
répondu Masood Moghini 2016-08-01 10:06:02

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
3
répondu Eugene Cuz 2017-01-19 14:42:18

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.

2
répondu Marek Wysocki 2017-05-01 01:39:30

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)
2
répondu altamont 2017-08-26 06:45:06

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 &nbsp; juste avant mon ordre qui était naturellement impossible à repérer à l'oeil nu:

if [[ "true" ]]; then
  &nbsp;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.

0
répondu Stefan van den Akker 2015-09-20 13:23:43

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
0
répondu Mike Goethals 2017-11-12 23:40:03

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.

0
répondu CNSKnight 2017-12-25 17:50:53

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
0
répondu Michael Freidgeim 2018-02-09 21:32:25

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.

0
répondu Kean Amaral 2018-07-09 21:27:44