2012-04-25 23 views
45

Me pregunto cuál es la forma más fácil de comprobar si un programa es ejecutable con bash, sin ejecutarlo? Debería al menos comprobar si el archivo tiene derechos de ejecución y tiene la misma arquitectura (por ejemplo, no un ejecutable de Windows u otra arquitectura no compatible, no 64 bits si el sistema es de 32 bits, ...) como el sistema actual.compruebe si un archivo es ejecutable

+0

Creo que ls -la [nombre de archivo] o stat [nombre de archivo] – ControlAltDel

+0

Ni ls -la ni stat dan información sobre la arquitectura admitida, que en realidad es la parte de la pregunta que más me interesa. un error porque un ejecutable no se había compilado para mi arquitectura, y me gustaría crear una secuencia de comandos para evitar eso en el futuro. – bob

+1

@bob: ¿Has intentado comprobar el resultado de 'archivo' ejecutado en esos archivos? – FatalError

Respuesta

71

Eche un vistazo a los diversos operadores test (esto es para el comando de prueba en sí, pero las pruebas integradas de BASH y TCSH son más o menos las mismas).

Se dará cuenta de que -x FILE dice archivo existe y ejecutar (o búsqueda) Se concede permiso.

BASH, Bourne, Ksh, Zsh Guión

if [[ -x "$file" ]] 
then 
    echo "File '$file' is executable" 
else 
    echo "File '$file' is not executable or found" 
fi 

TCSH o CSH Guión:

if (-x "$file") then 
    echo "File '$file' is executable" 
else 
    echo "File '$file' is not executable or found" 
endif 

Para determinar el tipo de archivo es, intentar el comando file. Puede analizar el resultado para ver exactamente qué tipo de archivo es. Word 'o Warning: A veces file devolverá más de una línea. Esto es lo que sucede en mi 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 

Los file comando devuelve la salida diferente dependiendo del sistema operativo. Sin embargo, la palabra executable estará en programas ejecutables, y generalmente la arquitectura también aparecerá.

Compare lo anterior a lo que me pasa en mi máquina Linux:

$ 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 

y una caja de Solaris:

$ file /bin/ls 
/bin/ls:  ELF 32-bit MSB executable SPARC Version 1, dynamically linked, stripped 

En los tres, verá la palabra executable y la arquitectura (x86-64, i386, o SPARC con 32-bit).


Adición

Muchas gracias, parece que el camino a seguir. Antes de marcar esto como mi respuesta, ¿pueden por favor guiarme en cuanto a qué tipo de script shell check debería realizar (es decir, qué tipo de análisis sintáctico) en 'archivo' para verificar si puedo ejecutar un programa? Si esta prueba es demasiado difícil de hacer en una base general, me gustaría al menos para comprobar si se trata de un ejecutable de Linux o osX (Mach-O)

De la parte superior de la cabeza, se podría hacer algo como este en BASH:

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 

Básicamente, estoy corriendo la prueba, entonces si eso es exitosa, hago un grep en la salida del comando file. El grep -q significa que no imprime ninguna salida, pero use el código de salida de grep para ver si encontré la cadena. Si su sistema no toma grep -q, puede intentar grep "regex" > /dev/null 2>&1.

Nuevamente, la salida del comando file puede variar de un sistema a otro, por lo que deberá verificar que funcionen en su sistema. Además, estoy comprobando el bit ejecutable. Si un archivo es un ejecutable binario, pero el bit ejecutable no está activado, diré que no es ejecutable. Esto puede no ser lo que quieres.

+0

¿El shell Bourne tiene '[[' o simplemente '['? –

+2

@glennjackman Bourne shell solo tiene '[', que en realidad es un comando externo, y no un built-in del shell. Por lo general, se encuentra en el directorio '/ bin'. Es un alias del comando 'test'. –

+0

Muchas gracias, parece ser el camino a seguir. Antes de marcar esto como mi respuesta, ¿pueden por favor guiarme en cuanto a qué tipo de script shell check debería realizar (es decir, qué tipo de análisis sintáctico) en 'archivo' para verificar si puedo ejecutar un programa? Si tal prueba es demasiado difícil de hacer de forma general, al menos me gustaría comprobar si se trata de un ejecutable de Linux o de un osX (Mach-O). – bob

5

Parece que nadie se dio cuenta de que -x operador no difiere del archivo con el directorio.

Así, para comprobar con precisión un archivo ejecutable, puede utilizar [[ -f SomeFile && -x SomeFile ]]

2

también parece nadie se dio cuenta del operador -x de los links. Un enlace simbólico (cadena) a un archivo normal (no clasificado como ejecutable) falla la prueba.

Cuestiones relacionadas