web-dev-qa-db-fra.com

message d'erreur de commande introuvable après avoir essayé d'exécuter un script UNIX

J'apprends à créer des scripts Shell sous UNIX, mais je continue à rencontrer cette erreur stupide. Disons que je fais un script comme celui-ci:

#!/bin/sh
echo HELLO

Je sauvegarde le fichier en tant que test et rend la commande exécutable par moi avec chmod 700 test. Je sauvegarde le fichier dans mon répertoire personnel et (tente) de l'exécuter comme suit:

./test

Seulement pour UNIX à répondre:

./test: Command not found.

Que se passe-t-il? Lorsque je tape ls -l, il y a un astérisque à côté du nom du fichier. Ce n'était pas là avant que j'aie utilisé la commande chmod. Quelqu'un peut-il me dire ce que je fais mal?

12
Waffles

Rendez-le exécutable:

chmod +x ./test

et assurez-vous d’enregistrer votre fichier au format Unix. Et: vérifiez si votre partition est exécutable (monter).

12
ivy

C'est vraiment très étrange. Les étapes que vous décrivez devraient avoir fonctionné, il doit donc y avoir une petite erreur dans votre environnement ou l'exécution de ces étapes. Vous pouvez faire certaines choses pour aider à diagnostiquer ceci:

VÉRIFICATION DES CARACTÈRES DE CONTRÔLE

Ce que vous avez documenté semble bien, tant qu'il n'y a pas de fautes de frappe ou de caractères de contrôle. Vous devriez vérifier en tapant:

cat -vt ./test

Si vous voyez un texte supplémentaire inattendu qui pourrait expliquer le problème. Par exemple, "^ M" à la fin d'une ligne indique que votre éditeur a enregistré le fichier au format Windows.

RÉGÉNÉRER LE FICHIER FIABLEMENT

Pour créer un ./test2 connu en bon état, copiez/collez les commandes ci-dessous:

`which bash`
printf "#\!`which sh`\necho HELLO\n" > ./test2
chmod +x ./test2
./test2
exit

VÉRIFICATION DE LA COMMANDE QUI NE PEUT ÊTRE TROUVÉE

Si vous tapez ...

./ajio

... obtenez-vous exactement ...

./ajio: Command not found.  

... comme vous l'avez décrit avec ./test? Je viens de composer le nom ajio afin qu'il ne devrait pas exister. Si les messages correspondent, cela ne vous dit pas vraiment quelque chose de nouveau. Mais si les messages diffèrent, cela confirme que ./test était au moins trouvé et exécutable.

Il est également possible que votre version de sh essaie de vous dire que test est introuvable, mais que lors de l'exécution de test, une commande exécutée par le shell n'a pas pu être trouvée. Cela ne devrait pas être la commande echo, comme dans la plupart des implémentations de Shell, ce sera une commande interne, implémentée à l'intérieur du Shell. Mais le shell peut exécuter un script d’initialisation contenant une ligne spécifiant une commande qu’il ne peut pas exécuter. Si vous exécutez man sh, il vous indiquera tous les différents fichiers de démarrage que votre shell peut essayer d’exécuter. Celles-ci peuvent être différentes de celles utilisées lors du démarrage interactif du shell. Mais, en tant que débutant, il peut être difficile de vérifier la validité de ces scripts. Il est probable que toute personnalisation fictive s’applique à votre processus de démarrage personnel de Shell et n’afflige pas l’ensemble de l’installation Linux. Exécutez donc ls -ld ~/.* pour répertorier les fichiers cachés dans votre répertoire personnel et inspectez ceux qui ressemblent à des fichiers de démarrage Shell (par exemple, ~/.bashrc, ~/.profile, ~/.bash_login). Vérifiez toutes les commandes spécifiées avec lesquelles, et sont invoquées une fois que la variable path est définie pour inclure leur emplacement.

COMPARER À UN AUTRE Shell

Si vous rencontrez un problème avec/bin/sh install/initialization, vous pourrez peut-être le contourner en appelant un autre shell. Essayer...

which zsh
which tcsh
which csh

... et si l’un d’entre eux trouve un autre shell possible, éditez ou recréez le fichier en spécifiant ce Shell, ala ...

#!/bin/csh
echo HELLO

... puis chmod +x it et ./- exécutez-le. Si cela fonctionne, alors vous savez que votre problème est spécifique à/bin/sh.

8
Tony Delroy

Il semble que vous ayez besoin d'une barre oblique avant la corbeille:

#!/bin/sh
# ^

Tout le reste semble bien ... Je suppose que /bin/sh est l'emplacement de votre exécutable Bournse Shell. Si ce n'est pas le cas, vous devrez procéder à des ajustements appropriés. Sans la barre oblique, votre shell recherche bin/shpar rapport à votre répertoire actuel, plutôt que son emplacement réel.

Vous devrez localiser l'interpréteur Shell exécutable que vous souhaitez (ou avez besoin) pour vos scripts.

Quelques autres suggestions - sur ma machine, les résultats sont les suivants:

# tells you where sh resides, if it is on your path
$ which sh
/bin/sh

# tells you which Shell you are currently using
$ echo $Shell
/bin/tcsh

Je peux utiliser l'un ou l'autre pour la ligne ' Shebang ' dans un script Shell simple. Vous constaterez peut-être que votre Bourne Shell se trouve dans /usr/bin plutôt que /bin par exemple.

5
martin clayton

Tout d’abord, vérifiez si/bin/sh est présent, sinon c’est votre problème. 

Si vous avez installé/bin/sh, je pense que cela se produit si votre chemin n’est pas correctement configuré. Dans ce cas, vous pouvez essayer: /bin/sh test.sh à partir du répertoire de travail actuel dans lequel se trouve test.sh. 

Essayez également dos2unix test.sh si vous avez copié le fichier à partir de Windows.

3
Chaos

Lorsque ./test est un script exécutable mais que son exécution est le résultat du message d'erreur ./test: Command not found, vérifiez que l'interpréteur existe. Vous devez donner un chemin absolu (la variable d’environnement PATH n’est pas utilisée).

Si le fichier est passé par une machine Windows, assurez-vous qu’il n’ya pas de retour chariot parasite en fin de ligne, car CR ferait partie du nom de fichier de l’interprète. Vous pouvez vérifier avec <test head -n 1 | od -t x1: si cela se termine par 0d 0a, il existe un CR et vous devez le supprimer (vous devrez peut-être également supprimer le CR d'autres lignes).

2
Gilles

J'ai eu un problème similaire avec un ancien ordinateur virtuel SCO OpenServer 5.0.7. M'a rendu fou que je ne pouvais pas exécuter certains scripts qui ont commencé avec

"#!/bin/bash"

(moins les guillemets, bien sûr) En lisant les discussions ici, il m'est apparu de vérifier si/bin/bash existait. Il s'avère qu'il manquait. J'ai installé à partir d'un CD SKUNKWARE2000 et tout allait bien.

1
Stephen Jones

J'ai eu le même problème où j'ai copié le fichier de Windows vers Linux et essayé de l'exécuter. J'ai fait toutes les suggestions ci-dessus, mais rien ne m'a aidé jusqu'à ce que je fasse un dos2unix sur le fichier et que cela soit corrigé. Ce n'est peut-être pas le cas pour vous, mais simplement le dire

1
Dula
0
Aminah Nuraini

Le #! indique à Unix d'exécuter votre script en utilisant le programme spécifié. Dans votre cas, vous avez spécifié bin/sh, mais il devrait s'agir de /bin/sh. Le message d'erreur donné par Unix n'est pas particulièrement clair quant au programme qu'il ne peut pas trouver.

0
Brian Agnew

Pour ajouter à la réponse de Martin, vous dites que vous enregistrez le fichier dans votre répertoire personnel et que vous l'exécutez en tant que ./test. Cela ne fonctionnera que si votre répertoire de travail actuel est identique à votre répertoire de base.

L'astérisque à côté du nom du fichier signifie que ce fichier est exécutable.

0
user405725