2017-08-18 3 views
0

J'écris un script avec un menu itératif pour exécuter des lignes de commande. Cependant, après avoir créé le menu itératif, j'ai une erreur quand je veux exécuter les commandes. L'erreur est [COMMAND] Aucun fichier ou répertoire linux.Script Bash perdu chemin shebang après la fonction d'instanciation

#!/bin/bash 
ATESTS=("TEST NAME 1" "TESTE NAME 2") 
PATH=("test1.xml" "text2.xml") 

menu() { 
    for i in ${!ATESTS[@]}; do 
     printf "%3d%s) %s\n" $((i+1)) "${OPT[i]:- }" "${ATESTS[i]}" 
    done 
    [[ "$msg" ]] && echo "$msg"; : 
} 

prompt="Check an ATEST (again to uncheck, ENTER when done): " 

while menu && read -rp "$prompt" num && [[ "$num" ]]; do 
    /usr/bin/clear; 
    [[ "$num" != *[![:digit:]]* ]] && 
    ((num > 0 && num <= ${#ATESTS[@]})) || 
    { msg="Invalid ATEST: $num"; continue; } 
    ((num--)); msg="${ATESTS[num]} was ${OPT[num]:+un}checked" 
    [[ "${OPT[num]}" ]] && OPT[num]="" || OPT[num]="+" 
done 

for i in ${!ATESTS[@]}; do 
    [[ "${OPT[i]}" ]] && { printf "%s " "${ATESTS[i]}"; msg=""; } 
done 

echo "$msg" 

for i in ${!ATESTS[@]}; do 
    if [[ "${OPT[i]}" ]] && [[ $PWD = /repo/$USER/program ]]; then 
     find . -iname ${PATH[i]} -exec cat {} \; 
    fi 
done 

Je veux trouver un fichier * .xml puis exécuter un script qui existent déjà et appartiennent à/usr/bin. Cependant la commande find ne s'exécute pas et aussi la commande cat dans cet exemple, obtenant l'erreur suivante ([COMMAND] Pas de tel fichier ou répertoire linux.)

si j'essaie d'exécuter une commande bash avant la fonction, la commande exécuter sans n'importe quel problème, mais après la fonction, les commandes échouent.

Je crée un alias au script pour exécuter/repo/$ USER/programme sans inclure le chemin vers le script.

Répondre

0

Le problème n'a rien à voir avec le shebang ou la fonction. Le problème est que vous utilisez la variable $PATH. Cette variable indique au système les répertoires à rechercher pour les commandes exécutables. Ainsi, lorsque vous le définissez sur un tableau ... il va commencer à chercher des commandes dans les emplacements spécifiés par ${PATH[0]}, qui est "test1.xml", qui n'est même pas un répertoire et encore moins celui qui contient tous les exécutables dont vous avez besoin. Solution: n'utilisez pas le nom de variable PATH pour autre chose que la liste de répertoires pour rechercher des commandes. En fait, comme il s'agit d'un grand nombre de variables majuscules qui ont des fonctions spéciales, il est préférable d'utiliser des variables minuscules (ou minuscules) dans vos scripts, pour éviter les conflits bizarres comme celui-ci.

BTW, je ne peux pas dire si le reste du script a un sens ou non; l'utilisation de booléens de court-circuit pour l'exécution conditionnelle (par exemple, this && that || do something) rend la logique très difficile. Je recommande fortement d'utiliser if blocs pour l'exécution conditionnelle (comme vous l'avez fait dans la boucle for à la fin); ils rendent beaucoup plus facile de dire ce qui se passe.