2017-08-18 1 views
0

Ich schreibe ein Skript mit einem iterativen Menü zum Ausführen von Befehlszeilen. Nach dem Erstellen des iterativen Menüs wurde jedoch ein Fehler angezeigt, wenn ich die Befehle ausführen möchte. Der Fehler ist [COMMAND] keine solche Datei oder Verzeichnis linux.Bash-Skript verloren Shebang Pfad nach Instantiate-Funktion

#!/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 

Ich möchte ein * .xml-Datei dann mit einem Skript ausführen, die bereits existieren und gehören zu/usr/bin. Der Befehl find wird jedoch nicht ausgeführt und auch der Befehl cat in diesem Beispiel, der folgende Fehler ([COMMAND] No solche Datei oder Verzeichnis linux.)

Wenn ich versuche, einen Bash-Befehl vor der Funktion auszuführen, führen Sie den Befehl ohne aus jedes Problem, aber nach der Funktion schlägt der Befehl fehl.

Ich erstellen einen Alias ​​für das Skript für die Ausführung von innerhalb/Repo/$ USER/Programm ohne den Pfad zum Skript enthalten.

Antwort

0

Das Problem hat nichts mit dem Shebang oder der Funktion zu tun. Das Problem ist, dass Sie die Variable $PATH verwenden. Diese Variable teilt dem System mit, in welchen Verzeichnissen nach ausführbaren Befehlen gesucht wird. Wenn Sie es also auf ein Array einstellen, sucht es nach Befehlen an den von ${PATH[0]} angegebenen Stellen, die "test1.xml" lautet ist nicht einmal ein Verzeichnis, geschweige denn eines, das alle ausführbaren Dateien enthält, die Sie benötigen.

Lösung: Verwenden Sie nicht den Variablennamen PATH für etwas anderes als die Liste der Verzeichnisse, um nach Befehlen zu suchen. Da es sich um eine von vielen Großbuchstaben handelt, die spezielle Funktionen haben, ist es am besten, in Ihren Skripten Kleinbuchstaben (oder Groß- und Kleinbuchstaben) zu verwenden, um seltsame Konflikte wie diese zu vermeiden.

BTW, ich kann nicht sagen, ob der Rest des Skripts sinnvoll ist oder nicht; Ihre Verwendung von Kurzschlussbooleschen für die bedingte Ausführung (z. B. this && that || do something) macht es wirklich schwierig, der Logik zu folgen. Ich würde dringend empfehlen, if Blöcke für die bedingte Ausführung zu verwenden (wie Sie in der Schleife for am Ende getan haben); Sie machen es viel einfacher zu sagen, was vor sich geht.