web-dev-qa-db-fra.com

Le script Bash affiche toujours "Commande introuvable"

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?

87
David

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.

141
chown

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

46
clyfish

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

35
Lypso345

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.

11
paxdiablo

utilisez dos2unix sur votre fichier de script. 

6
bash-o-logist

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.

6
Juniar

pour l'exécution que vous devez fournir le chemin complet de cette par exemple

/home/Manuel/mywrittenscript
5
Masood Moghini
5
Aminah Nuraini

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)
4
altamont

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
3
Eugene Cuz

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.

2
Marek Wysocki

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
1
Michael Freidgeim

Je me suis heurté à cela aujourd'hui, copiant distraitement la commande dollar Prompt $ (devant une chaîne de commande) dans le script.

0
CNSKnight

J'avais aussi une partie du Cannot execute command. Tout semblait correct, mais en fait, j'avais un espace non cassable &nbsp; juste avant ma commande, ce qui était bien sûr impossible à repérer à l'œil nu:

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

0

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
0
Mike Goethals

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.

0
Kean Amaral