Es muy común que a quienes están migrando desde Windows les surja la duda de cómo identificar el archivo ejecutable de una aplicación.
Pues claro, en Windows la estructura de directorios y archivos es completamente diferente a nuestro mundo.
En Windows (XP) casi todos los programas se encuentran bajo una carpeta "Archivos de Programa", el sistema operativo está en su propia carpeta "Windows" y el almacenamiento se realiza en la unidad C:.
En Linux, la distribución del sistema operativo y las aplicaciones tiene una organización muy distinta. No existe la unidad ( c: ) como concepto.
Todo se desprende de un "árbol" de directorios cuya raíz, es justamente, root (/).
Entonces vemos que nos queda un árbol mas o menos así:
/ Raíz del sistema de archivos
/dev Contiene ficheros del sistema que representan los dispositivos
/etc Contiene archivos de configuración del sistema y los servicios
/home Es la carpeta donde se almacenan los archivos de los usuarios
/lib Tiene librerías
/mnt Es una carpeta para montar otros recursos, como un cdrom por ejemplo
/proc Tiene archivos que reciben o envían información al kernel del sistema
/usr Aquí se encuentran los programas
/usr/bin Programas de uso general
/usr/sbin Programas de uso administrativo (solo los puede correr el usuario root)
/var Carpeta que contiene entre otras cosas, archivos de log
/tmp Carpeta de uso temporal (se borra al reiniciar)
Cuando vemos dónde se almacena un programa (por ejemplo firefox) vemos que lo hace en varios lugares diferentes:
$ find / -name firefox*
/usr/share/pixmaps/firefox.png
/usr/share/man/man1/firefox.1.gz
/usr/bin/firefox
/usr/lib/firefox-3.0.1
~/.mozilla/firefox
El primero es el ícono, el segundo la documentación, el tercero es el programa en si (ya que está dentro de /usr/bin), el cuarto es la carpeta de las librerías que usa firefox y el último es una carpeta de preferencias de mi usuario (nótese que el símbolo ~ representa mi carpeta: /home/mi-usuario)
¿Pero cómo reconocemos un programa o un archivo ejecutable?
En linux, casi cualquier archivo puede ser ejecutable.
Hagamos una pequeña prueba. Abramos una terminal y corramos el siguiente comando:
$ ls -la /usr/bin/fil*
-rwxr-xr-x 1 root root 15036 mar 11 05:57 /usr/bin/file
-rwxr-xr-x 1 root root 380324 jul 1 15:32 /usr/bin/file-roller
Sabemos que son programas porque se encuentran en la carpeta /usr/bin, pero también porque vemos los atributos de los archivos "rwxr-xr-x"
r = read (lectura)
w = write (escritura)
x = execute (ejecución)
Recomiendo que lean esta guía escrita por Hermes sobre los permisos de archivos.
¿Pero que clase de archivo ejecutable es?
Digo clase, porque un ejecutable puede ser de tipo ELF o script.
Para saber que tipo de archivo es existe el comando "file"
$ file /usr/bin/file
/usr/bin/file: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped
Vemos que el mismo comando file se reconoce a si mismo como un ejecutable tipo ELF de 32-bit
Otros ejemplos:
$ file Google_Earth_CZXD.bin
Google_Earth_CZXD.bin: Bourne shell script text executable
$ file vbox-usb.sh
vbox-usb.sh: Bourne-Again shell script text executable
$ file freesshdt.pl
freesshdt.pl: perl script text executable
$ file animation.rb
animation.rb: ASCII English text, with CRLF line terminators
$ file MobileMediaConverter
MobileMediaConverter: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.2.5, stripped
$ file bookmarks.html
bookmarks.html: exported SGML document text
$ file bookmarks.html.tar.gz
bookmarks.html.tar.gz: gzip compressed data, was ".fr.4988.0.bookmarks.html.tar", from Unix, last modified: Thu Jan 3 00:48:18 2008
$ file GTAINSTALLER.exe
GTAINSTALLER.exe: PE32 executable for MS Windows (GUI) Intel 80386 32-bit
De todos estos ejemplos el único "intruso" es GTAINSTALLER.exe ya que es nativo de windows.
Nota acerca de los scripts
Los Bourne-Again Shell (bash), Shell (sh) y Perl scripts (pl) tienen un encabezado que le indica al comando file que tipo de archivo es.
Si visualizaramos el contenido de un script seguramente nos encontraríamos con una primera línea como esta:
#!/bin/bash
o si fuese perl, sería
#!/usr/bin/perl
Otro dato curioso.
El caso del instalador de Google Earth.
Si lo analizamos, es un archivo shell script, ya que el comando file así lo indica, pero si lo miramos por dentro veremos que es un shell script que tiene pegado un archivo tar. El mismo script se encarga de extraer el archivo tar, verificar la suma MD5 y ejecutar otro script llamado setup.sh.
Conclusión
Vimos que cualquier archivo puede ser ejecutable en linux.
Podemos encontrarnos con un shell script, un ejecutable ELF, la combinación de scripts y archivadores, etc.
Pero lo más importante es que siempre debe leerse primero el archivo README, ya sea un paquete tar.gz con código fuente o incluso el encabezado de los scripts, ya que hay muchos programadores que suelen comentar sus scripts con indicaciones e instrucciones de uso.
Diviertanse y tengan cuidado con lo que ejecutan!
Saludos