Le script Shell ne fonctionne pas, commande non trouvée
Je suis très, très nouveau sous UNIX programmation (en cours d'exécution sur Mac osx Mountain Lion via le Terminal). J'ai appris les bases à partir d'un bio-informatique et méthodes moléculaires cours (nous avons eu deux classes) où nous seront éventuellement à l'aide de perl et python pour les données à des fins de gestion. De toute façon, nous avons été chargés de la rédaction d'un script shell de prendre les données d'un groupe de fichiers et de les écrire dans un nouveau fichier dans un format qui peut être lu par un programme spécifique (Migrer-N).
J'ai obtenu un certain nombre de fonctions pour faire exactement ce dont j'ai besoin, indépendamment, quand je tape dans la ligne de commande, mais quand je les ai mis tous ensemble dans un script et essayez de le lancer, j'obtiens une erreur. Voici les détails (je m'excuse pour la longueur):
#! /bin/bash
grep -f Samples.NFCup.txt locus1.fasta > locus1.NFCup.txt
grep -f Samples.NFCup.txt locus2.fasta > locus2.NFCup.txt
grep -f Samples.NFCup.txt locus3.fasta > locus3.NFCup.txt
grep -f Samples.NFCup.txt locus4.fasta > locus4.NFCup.txt
grep -f Samples.NFCup.txt locus5.fasta > locus5.NFCup.txt
grep -f Samples.Salmon.txt locus1.fasta > locus1.Salmon.txt
grep -f Samples.Salmon.txt locus2.fasta > locus2.Salmon.txt
grep -f Samples.Salmon.txt locus3.fasta > locus3.Salmon.txt
grep -f Samples.Salmon.txt locus4.fasta > locus4.Salmon.txt
grep -f Samples.Salmon.txt locus5.fasta > locus5.Salmon.txt
grep -f Samples.Cascades.txt locus1.fasta > locus1.Cascades.txt
grep -f Samples.Cascades.txt locus2.fasta > locus2.Cascades.txt
grep -f Samples.Cascades.txt locus3.fasta > locus3.Cascades.txt
grep -f Samples.Cascades.txt locus4.fasta > locus4.Cascades.txt
grep -f Samples.Cascades.txt locus5.fasta > locus5.Cascades.txt
echo 3 5 Salex_melanopsis > Smelanopsis.mig
echo 656 708 847 1159 779 >> Smelanopsis.mig
echo 154 124 120 74 126 NFCup >> Smelanopsis.mig
cat locus1.NFCup.txt locus2.NFCup.txt locus3.NFCup.txt locus4.NFCup.txt locus5.NFCup.txt >> Smelanopsis.mig
echo 32 30 30 18 38 Salmon River >> Smelanopsis.mig
cat locus1.Salmon.txt locus2.Salmon.txt locus3.Salmon.txt locus4.Salmon.txt locus5.Salmon.txt >> Smelanopsis.mig
echo 56 52 24 29 48 Cascades >> Smelanopsis.mig
cat locus1.Cascades.txt locus2.Cascades.txt locus3.Cascades.txt locus4.Cascades.txt locus5.Cascades.txt >> Smelanopsis.mig
La série de grep sont juste de sortir d'une séquence d'ADN de données pour chaque site pour chaque locus dans de nouveaux fichiers texte. L'Samples...txt les fichiers ont l'échantillon de numéros d'identification pour un site, le .fasta fichiers de la séquence de l'information organisé par l'identification de l'échantillon; la grepping fonctionne très bien en ligne de commande si je l'exécute individuellement.
Le deuxième groupe de code crée le nouveau fichier que j'ai besoin à la fin, qui se termine en .mig. L'écho des lignes sont données sur le nombre de paires de bases par locus, les populations dans l'analyse, les échantillons par site, etc.) que le programme a besoin d'informations. Le chat les lignes sont écrasez ensemble du locus par les données d'un site créé par tous les grepping ci-dessous le site des informations spécifiques dictées dans l'écho de la ligne. Vous avez sans doute obtenir l'image.
Pour créer le script shell que j'ai commencé dans Excel afin que je puisse facilement copier-coller/remplissage automatique des cellules, de la sauvegarde en texte délimité par des tabulations, puis l'ouverture de ce fichier texte dans TextWrangler pour supprimer les onglets avant de l'enregistrer en tant que .sh fichier (les sauts de Ligne: Unix (LF) et de l'Encodage: Unicode (UTF-8)) dans le même répertoire que tous les fichiers utilisés dans le script. J'ai essayé d'utiliser chmod +x FILENAME.sh
et chmod u+x FILENAME.sh
pour essayer de s'assurer qu'il est exécutable, mais en vain. Même si je coupe le script vers le bas, juste un simple grep ligne (avec le #! /bin/bash première ligne) je ne peux pas le faire fonctionner. Le processus ne prend qu'un instant lorsque je tape directement dans la ligne de commande comme aucun de ces fichiers sont de plus de 160 KO et certains sont nettement plus petits. C'est ce que je fais et ce que j'obtiens quand j'essaie d'exécuter le fichier (HW est le bon répertoire)
localhost:HW Mirel$ MigrateNshell.sh
-bash: MigrateNshell.sh: command not found
J'ai été à cette impasse depuis deux jours maintenant, de sorte que toute entrée serait grandement apprécié! Merci!!
source d'informationauteur ChickadeeChick
Vous devez vous connecter pour publier un commentaire.
Pour des raisons de sécurité, le shell va pas rechercher le répertoire courant (par défaut) pour un fichier exécutable. Vous devez être précis et dire
bash
que votre script est dans le répertoire courant (.
):Modifier la première ligne à la suivante, comme l'a souligné Marc B
Marque ensuite le script exécutable et de l'exécuter à partir de la ligne de commande
ou simplement exécuter bash à partir de la ligne de commande de passage dans votre script en tant que paramètre
Assurez-vous que vous n'êtes pas à l'aide de "CHEMIN" de la variable qui va remplacer le CHEMIN d'accès existant pour les variables d'environnement.
Aussi essayer de
dos2unix
le script shell, parce que parfois il a des Fenêtres des fins de ligne et le shell ne le reconnaît pas.Cela aide parfois.
Il y a eu quelques bons commentaires sur l'ajout de la ligne shebang au début du script. Je voudrais ajouter une recommandation d'utiliser le commande env ainsi, pour plus de portabilité.
Tout
#!/bin/bash
peut-être à l'emplacement approprié sur votre système, qui n'est pas universel. En outre, cela peut ne pas être l'utilisateur préféré bash.#!/usr/bin/env bash
sélectionne le premier bash trouve dans le chemin d'accès.Essayer
chmod u+x MigrateNshell.sh
supprimer l'endroit indiqué. L'arborescence doit être
Unix a une variable appelée
PATH
qui est une liste de répertoires où trouver les commandes.Si je tape une commande
foo
à la ligne de commande, mon shell va d'abord voir si il y a une commande exécutable/usr/local/bin/foo
. Si il y est, il va exécuter/usr/local/bin/foo
. Si non, il va voir si il y a une commande exécutable/usr/bin/foo
et si pas là, il va chercher à voir si/bin/foo
existe, etc. jusqu'à ce qu'il arrive à/Users/david/bin/foo
.Si il ne peut pas trouver une commande
foo
dans l'un de ces répertoires, il me dire commande pas trouvé.Il y a plusieurs façons de traiter ce problème:
bash foo
depuisfoo
est un script shell./Users/david/foo
ou$PWD/foo
ou tout simplement./foo
.$PATH
variable pour ajouter le répertoire qui contient vos commandes pour le CHEMIN d'accès.Vous pouvez modifier
$HOME/.bash_profile
ou$HOME/.profile
si.bash_profile
n'existe pas. Je n'ai qu'à ajouter dans/usr/local/bin
lequel j'ai placé en premier dans mon chemin. De cette façon, je peux remplacer le standard de commandes qui se trouvent dans les OS. Par exemple, j'ai des Fourmis 1.9.1, mais le Mac est venu avec Ant 1.8.4. J'ai mis monant
commande en/usr/local/bin
donc ma version deant
exécuté en premier. J'ai également ajouté$HOME/bin
à la fin de la VOIE de mes propres commandes. Si j'avais un fichier comme celui que vous souhaitez exécuter, je vais le placer dans $HOME/bin pour l'exécuter.Aussi assurez-vous que /bin/bash est le bon endroit pour bash .... si vous avez pris cette ligne à partir d'un exemple quelque part, il peut ne pas correspondre à votre serveur en particulier. Si vous spécifiez un emplacement non valide pour bash, vous allez avoir un problème.
Ajouter les lignes ci-dessous dans votre .chemin d'accès du profil
Maintenant, votre script doit fonctionner sans
./
Raj Dagla
Première:
Alors:
Ou ajoutez votre programme dans un répertoire reconnu dans votre variable $PATH. Exemple: Variable Path Exemple
Ce qui vous permettra de composer votre programme sans
./