Jetez un œil aux différents opérateurs de test (c'est pour la commande de test elle-même, mais les tests intégrés BASH et TCSH sont plus ou moins les mêmes).
Vous remarquerez que -x FICHIER
signifie le FICHIER existe et la permission d'exécution (ou de recherche) est accordée.
Script BASH, Bourne, Ksh, Zsh
if [[ -x "$fichier" ]]
then
echo "Le fichier '$fichier' est exécutable"
else
echo "Le fichier '$fichier' n'est pas exécutable ou introuvable"
fi
Script TCSH ou CSH:
if ( -x "$fichier" ) then
echo "Le fichier '$fichier' est exécutable"
else
echo "Le fichier '$fichier' n'est pas exécutable ou introuvable"
endif
Pour déterminer le type de fichier, essayez la commande file. Vous pouvez analyser la sortie pour voir exactement quel type de fichier il s'agit. Attention : Parfois, file
renverra plus d'une ligne. Voici ce qui se passe sur mon Mac :
$ file /bin/ls
/bin/ls: Mach-O binaire universel avec 2 architectures
/bin/ls (pour l'architecture x86_64) : Exécutable Mach-O 64 bits x86_64
/bin/ls (pour l'architecture i386) : Exécutable Mach-O i386
La commande file
renvoie une sortie différente en fonction du système d'exploitation. Cependant, le mot exécutable
apparaîtra dans les programmes exécutables, et généralement l'architecture apparaîtra aussi.
Comparez cela à ce que j'obtiens sur mon Linux :
$ file /bin/ls
/bin/ls: ELF exécutable LSB 64 bits, AMD x86-64, version 1 (SYSV), pour GNU/Linux 2.6.9, lié de manière dynamique (utilise des bibliothèques partagées), déstrippé
Et un Solaris :
$ file /bin/ls
/bin/ls: ELF exécutable MSB 32 bits SPARC Version 1, lié de manière dynamique, déstrippé
Dans les trois cas, vous verrez le mot exécutable
et l'architecture (x86-64
, i386
ou SPARC
avec 32-bit
).
Addendum
Merci beaucoup, c'est la marche à suivre. Avant de marquer ceci comme ma réponse, pouvez-vous me guider sur le type de test de script shell que je devrais effectuer (c'est-à-dire, quel type de parsing) sur 'file' pour vérifier si je peux exécuter un programme ? Si un tel test est trop difficile à faire de manière générale, j'aimerais au moins vérifier s'il s'agit d'un exécutable linux ou osX (Mach-O)
De mémoire, vous pourriez faire quelque chose comme cela en BASH :
if [ -x "$fichier" ] && file "$fichier" | grep -q "Mach-O"
then
echo "Il s'agit d'un fichier Mac exécutable"
elif [ -x "$fichier" ] && file "$fichier" | grep -q "GNU/Linux"
then
echo "Il s'agit d'un fichier Linux exécutable"
elif [ -x "$fichier" ] && file "$fichier" | grep q "script shell"
then
echo "Il s'agit d'un script shell exécutable"
elif [ -x "$fichier" ]
then
echo "Ce fichier est simplement marqué comme exécutable, mais son type est un mystère"
else
echo "Ce fichier n'est même pas marqué comme étant exécutable"
fi
Fondamentalement, je fais le test, puis si cela réussit, je fais un grep sur la sortie de la commande file
. Le grep -q
signifie ne pas imprimer de sortie, mais utiliser le code de sortie de grep pour voir si j'ai trouvé la chaîne. Si votre système ne prend pas grep -q
, vous pouvez essayer grep "regex" > /dev/null 2>&1
.
Encore une fois, la sortie de la commande file
peut varier d'un système à l'autre, vous devrez donc vérifier que cela fonctionnera sur votre système. De plus, je vérifie le bit exécutable. Si un fichier est un exécutable binaire, mais que le bit exécutable n'est pas activé, je dirai qu'il n'est pas exécutable. Ce n'est peut-être pas ce que vous voulez.
1 votes
Je penserais soit ls -la [nom du fichier] ou stat [nom du fichier]
1 votes
Ni ls -la ni stat ne donnent d'informations sur l'architecture prise en charge, ce qui est en réalité la partie de la question qui m'intéresse le plus. J'ai rencontré une erreur parce qu'un exécutable n'avait pas été compilé pour mon architecture, et j'aimerais créer un script pour éviter cela à l'avenir.
2 votes
@bob: Avez-vous essayé de vérifier la sortie de
file
exécutée sur ces fichiers?1 votes
@FatalError Comment pourrais-je analyser la sortie du fichier pour vérifier si l'exécutable est conforme à mon architecture ?
0 votes
Vérifier : opérateurs de test de fichiers