El punto clave es este: las extensiones son irrelevantes en cualquier sistema de sistema similar a Unix. Un nombre de archivo es solo nombre y no tiene ningún efecto sobre si se puede ejecutar un script o un ejecutable compilado . Un programador puede agregar una .sh
extensión para designar que un archivo es un script de shell, o .py
para un script de Python, pero a diferencia de Windows, a unix no le importan los nombres, se preocupa por los permisos.
Lo que importa es el permiso ejecutable otorgado a un archivo. Que puedes consultar con
ls -l /path/to/file
Ejecutando ejecutables
Para ejecutar el script, generalmente hay varias formas.
- Si su directorio actual es el mismo que el script, y el script tiene permisos ejecutables, puede ejecutarlo así
./my_script_name
. El .
directorio actual de medios.
- Si su directorio actual es diferente y el script tiene permisos ejecutables, puede ejecutarlo especificando la ruta completa:
/home/user/bin/my_script_name
(Los dos métodos anteriores se basan en tener un conjunto de permisos ejecutables; si el archivo es o no parte de la $PATH
variable es irrelevante. La presencia de #!
línea también es importante; sin ella, el script será ejecutado por el shell actual que haya abierto. Si tengo un csh
script sin esa línea, e intenta ejecutarla en bash con ./my_script.csh
, fallará)
- Si su script se encuentra en el directorio que forma parte de su
$PATH
variable, puede ejecutarlo simplemente llamando al nombre. Puede llamar al chmod
comando en la línea de comando simplemente escribiendo su nombre porque está en la /bin
carpeta. /bin
siempre es parte de la $PATH
variable. En este caso, los permisos ejecutables y la ubicación del script son importantes
- Especificando un intérprete como comando y script como argumento. De esa manera, el script servirá como archivo de entrada para el intérprete.
- Abastecimiento de un archivo. El
. filename.sh
o source filename.sh
hará que el script sea tratado como si fuera una entrada de teclado, es decir, como si estuviera escrito directamente en la línea de comando. En este caso, los permisos ejecutables y la ubicación no importan
Ejemplos
Ejemplo # 1, ejecutando con intérprete, para ejecutar permisos
$-> ls -l abc.py
-rw-rw-r-- 1 xieerqi xieerqi 44 Apr 27 22:39 abc.py
$-> python abc.py
a
b
c
Ejemplo # 2, ejecutando con ./
conjunto de permisos ejecutables, conjunto de líneas shebang.
$-> cat abc.py
#!/usr/bin/env python
for letter in 'a' 'b' 'c' :
print letter
$-> ls -l abc.py
-rwxrwxr-x 1 xieerqi xieerqi 66 Apr 27 23:02 abc.py*
$-> ./abc.py
a
b
c
Ejemplo # 3, ejecutando sin conjunto de líneas shebang (falla, porque bash no puede leer los scripts de python; ninguna línea shebang asume el shell actual como intérprete)
$-> cat abc.py
for letter in 'a' 'b' 'c' :
print letter
$-> ./abc.py
./abc.py: 2: ./abc.py: Syntax error: word unexpected (expecting "do")
Ejemplo # 4, ejecutando script que tiene permisos ejecutables configura la carpeta de formulario que es parte de la $PATH
variable
# /home/xieerqi/bin is part of my path variable
$-> echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/opt/microchip/xc16/v1.25/bin:/opt/microchip/xc32/v1.40/bin:/opt/microchip/xc8/v1.35/bin:/home/xieerqi/bin:/home/xieerqi/bin/sh
$-> # current directory is /home/xieerqi
$-> pwd
/home/xieerqi
$-> # move the file to ~/bin
$-> mv ~/abc.py ~/bin/abc.py
$-> # now I can run it just by calling the name
$-> abc.py
/home/xieerqi/bin/abc.py: 2: /home/xieerqi/bin/abc.py: Syntax error: word unexpected (expecting "do")
$-> # Syntax error because again, no interpreter specified.
$-> # must add #!/usr/bin/env python
$-> vi /home/xieerqi/bin/abc.py
$-> # after adding the line with vi text editor, we can run
$-> abc.py
a
b
c
Ejemplo # 5, eliminando la extensión, todavía se ejecuta porque las extensiones no importan, pero tiene permisos y es parte de $PATH
:
$-> mv ~/bin/abc.py ~/bin/abc
$-> abc
a
b
c
.sh
En muchas circunstancias, el uso como extensión se considera una mala práctica: es contrario a la forma en que se nombran otros comandos (no se ejecutals.elf
), a menudo es engañoso (sifoo.sh
comienza con#!/bin/bash
, entonces la ejecuciónsh foo.sh
lo ejecutará con un intérprete diferente al que está diseñado para ), y si reescribefoo.sh
para ser un programa Python, usar esa extensión significa que debes elegir entre mantener el nombre ahora engañoso y reescribir cada programa que lo llame.