Schauen Sie sich die verschiedenen Testoperatoren an (dies gilt für den Testbefehl selbst, aber die integrierten BASH- und TCSH-Tests sind mehr oder weniger gleich).
Sie werden feststellen, -x FILE
dass FILE existiert und die Berechtigung zum Ausführen (oder Suchen) erteilt wurde .
BASH, Bourne, Ksh, Zsh Script
if [[ -x "$file" ]]
then
echo "File '$file' is executable"
else
echo "File '$file' is not executable or found"
fi
TCSH- oder CSH-Skript:
if ( -x "$file" ) then
echo "File '$file' is executable"
else
echo "File '$file' is not executable or found"
endif
Um die zu bestimmen Art von Datei es sich handelt, versuchen Sie die Datei - Befehl. Sie können die Ausgabe analysieren, um genau zu sehen, um welchen Dateityp es sich handelt. Word 'o Warnung : Manchmal file
wird mehr als eine Zeile zurückgegeben. Folgendes passiert auf meinem Mac:
$ file /bin/ls
/bin/ls: Mach-O universal binary with 2 architectures
/bin/ls (for architecture x86_64): Mach-O 64-bit executable x86_64
/bin/ls (for architecture i386): Mach-O executable i386
Der file
Befehl gibt je nach Betriebssystem unterschiedliche Ausgaben zurück. Das Wort executable
wird jedoch in ausführbaren Programmen enthalten sein, und normalerweise wird auch die Architektur angezeigt.
Vergleichen Sie das Obige mit dem, was ich auf meiner Linux-Box bekomme:
$ file /bin/ls
/bin/ls: ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), stripped
Und eine Solaris-Box:
$ file /bin/ls
/bin/ls: ELF 32-bit MSB executable SPARC Version 1, dynamically linked, stripped
In allen drei, werden Sie das Wort sehen executable
und die Architektur ( x86-64
, i386
oder SPARC
mit 32-bit
).
Nachtrag
Vielen Dank, das scheint der richtige Weg zu sein. Bevor ich dies als meine Antwort markiere, können Sie mich bitte anleiten, welche Art von Skript-Shell-Prüfung ich für 'Datei' durchführen müsste (dh welche Art von Analyse), um zu prüfen, ob ich ein Programm ausführen kann? Wenn ein solcher Test im Allgemeinen zu schwierig ist, möchte ich zumindest prüfen, ob es sich um eine ausführbare Linux-Datei oder um osX (Mach-O) handelt.
Auf den ersten Blick könnten Sie in BASH so etwas tun:
if [ -x "$file" ] && file "$file" | grep -q "Mach-O"
then
echo "This is an executable Mac file"
elif [ -x "$file" ] && file "$file" | grep -q "GNU/Linux"
then
echo "This is an executable Linux File"
elif [ -x "$file" ] && file "$file" | grep q "shell script"
then
echo "This is an executable Shell Script"
elif [ -x "$file" ]
then
echo "This file is merely marked executable, but what type is a mystery"
else
echo "This file isn't even marked as being executable"
fi
Grundsätzlich führe ich den Test aus. Wenn dies erfolgreich ist, überprüfe ich die Ausgabe des file
Befehls. Die grep -q
Mittel drucken keine Ausgabe, sondern verwenden den Exit-Code von grep, um zu sehen, ob ich die Zeichenfolge gefunden habe. Wenn Ihr System nicht benötigt, grep -q
können Sie es versuchen grep "regex" > /dev/null 2>&1
.
Auch hier kann die Ausgabe des file
Befehls von System zu System variieren. Sie müssen daher überprüfen, ob diese auf Ihrem System funktionieren. Außerdem überprüfe ich das ausführbare Bit. Wenn eine Datei eine binäre ausführbare Datei ist, das ausführbare Bit jedoch nicht aktiviert ist, ist sie nicht ausführbar. Dies ist möglicherweise nicht das, was Sie wollen.