Necesitaría algunas aclaraciones sobre la forma en que ejecutamos los ejecutables en la terminal. Esta podría ser una pregunta poco convincente, pero ¿cuál es la diferencia entre ejecutar un ejecutable con ./an_executable
y . an_executable
(supongamos que estamos en el directorio donde se encuentra an_executable)
Ya sé que el primero hace que el shell busque un_executable en el directorio actual ( .
), pero ¿por qué no es /
necesario después de .
usar la última versión?
Gracias por adelantado.
command-line
executable
zipzap
fuente
fuente
Respuestas:
La
. executable
sintaxis no funciona con cualquier ejecutable (¿o sí?). En cambio, es un alias para el bashsource
incorporado. Entonces, la diferencia es principalmente relevante para los scripts de bash, y la verdad es que son cosas completamente diferentes :)./executable
pide ejecutar el ejecutable "normalmente"../
es una referencia relativa a la ruta actual. Esto evita que el shell (bash) intente ubicar el ejecutable en un directorio$PATH
(lo que haría si no especificara una ruta con el comando). La razón por la que no sólo puede hacerexecutable
es una de la seguridad; imagine que descomprime un archivo que descargó y que contiene una versión maliciosa dels
. Si se ejecutara directamente desde su directorio actual, ejecutaría esa versión sin darse cuenta.Por otro lado,
. executable
está diciendo "fuente de un archivo llamadoexecutable
". Dado que está nombrando directamente el archivo y realmente no tiene que ser un ejecutable, la restricción de seguridad para $ PATH no se aplica. Sourcing solo "ejecutará" (o parece que se ejecuta) scripts de shell. Lo que hace es:Entonces ... ¿Cuál es realmente la diferencia entre la ejecución y el abastecimiento? Suponiendo que el mismo script de shell, ejecutarlo (
./script
) generará un nuevo shell, ejecutará el script dentro de ese shell, y cuando el script salga, cierre ese shell y regrese al shell principal. En efecto, comenzará un nuevobash
proceso para ejecutar el script).(
. script
) hará que el shell actual lea los comandos del archivo como si se estuvieran escribiendo en la línea de comandos. No se genera un nuevo caparazón.Una manera muy fácil de ver cómo se comporta esto es escribir un script que solo contenga
exit
. Si lo./script
hace, parece que no sucederá nada, esto se debe a que se inicia un nuevo proceso de shell, elexit
comando sale de ese nuevo shell y su shell actual no se ve afectado.Si usted
. script
, su terminal actual se cerrará, porque elexit
comando se ejecuta en el shell actual. Por lo tanto, es equivalente a escribirexit
en el símbolo del sistema.fuente
ls
salida: escribe el comando, se ejecuta, muestra la salida y luego termina, pero la salida permanece en el terminal.bash
shell que se ejecuta dentro de él. Si escribebash
, ejecutará otro shell; para el primer shell, es solo un programa para ejecutarse. Si escribeexit
, cerrará el último shell que inició, pero seguirá estando en el primer shell (el de cuando inició el terminal). Nuevamente, todo esto sucede dentro de la misma terminal.