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
Respuesta
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.
¿El shell Bourne tiene '[[' o simplemente '['? –
@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'. –
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
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 ]]
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.
- 1. compruebe si el archivo es de un tipo determinado
- 2. Compruebe si un archivo PDF es válido (Python)
- 3. Compruebe si se escanea un archivo PDF
- 4. Compruebe si existe un archivo ejecutable en la ruta de Windows
- 5. Compruebe si un archivo está abierto
- 6. Compruebe si un objeto es un delegado
- 7. compruebe si un objeto es nulo
- 8. Compruebe si el valor es un número
- 9. Python: compruebe si el archivo cargado es jpg
- 10. Compruebe si un directorio es un (sistema de archivos) raíz
- 11. Compruebe si el archivo ya está abierto
- 12. C compruebe si el archivo existe
- 13. Compruebe si un archivo es de archivo (zip o rar) usando php
- 14. compruebe si la dirección mmap'ed es correcta
- 15. cómo saber si la ruta conduce a un archivo ejecutable?
- 16. Compruebe si el archivo existe en ksh
- 17. compruebe si el archivo existe en php
- 18. Compruebe si un archivo está bloqueado en Java
- 19. Compruebe si existe un archivo en el servidor
- 20. bash: compruebe si existe un archivo remoto usando scp
- 21. Compruebe si un objeto es un NSArray o NSDictionary
- 22. Compruebe si un argumento es una lista o un átomo
- 23. Compruebe si string es un prefijo de un Javascript RegExp
- 24. Compruebe si un valor de scanf es un número?
- 25. compruebe si un archivo está abierto en Python
- 26. Compruebe si el archivo tiene un formato CSV con Python
- 27. Compruebe si existe un archivo/directorio: ¿hay una mejor manera?
- 28. Python: compruebe si un archivo está vacío o no
- 29. Compruebe si una ruta representa un archivo o una carpeta
- 30. Compruebe si el tipo es hashable
Creo que ls -la [nombre de archivo] o stat [nombre de archivo] – ControlAltDel
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
@bob: ¿Has intentado comprobar el resultado de 'archivo' ejecutado en esos archivos? – FatalError