¿Por qué algunos sistemas ejecutarán un .sh
archivo simplemente especificando el nombre del archivo sin extensión y otros requieren nombre más extensión? En mi caso, estoy tratando de escribir una serie de comandos siguiendo estas instrucciones .
Ahora estoy especificando la extensión, pero .sh
sería preferible ejecutar los comandos sin ellos.
command-line
scripts
Philip Kirkbride
fuente
fuente
.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.+x
set - dondefoo.sh
hay una biblioteca que puede obtenerse en cualquier shell POSIX,foo.bash
puede obtenerse en bash,foo.ksh
en ksh, etc.Respuestas:
Estas confundido. La
.sh
extensión es solo una pista para los humanos, y no tiene absolutamente ningún efecto sobre cómo el sistema maneja el archivo. Unix / Linux no cometió elSecrets.pdf.exe
error de Windows .Esto es lo que sucede cuando escribe
foo
:Redirección para
STDIN
,STDOUT
ySTDERR
están configurados.El shell comprueba su tabla hash interna para ver si ya conoce una
$PATH
entrada parafoo
. Si no existe ninguno, el shell busca en los directorios$PATH
, buscando un archivo llamadofoo
que tenga el bit Ejecutar establecido en sus permisos de archivo. Primerofoo
gana.Si los dos primeros bytes del archivo
foo
son#!
, la siguiente cadena es el nombre de un intérprete para ejecutar. Por lo tanto,#!/bin/bash
introduce un script Bash,#!/usr/bin/perl
introduce un script Perl, etc.Si el archivo comienza con
\177ELF
, es un ejecutable binario y lold.so
inicia.Lea
man execve
yman ld.so
para una explicación más detallada.fuente
chmod +x
) prácticamente resuelve esto, ¿verdad?x
bit de manera optimista en todo) y de dónde vino el archivo (cualquier proceso con control del directorio podría ser engañado para establecer los permisos) . Entonces, lo mitiga , pero no diría que lo resuelve .Secrets.pdf.exe
porque siempre desactivo lahide file extension
función estúpidaEl 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
Ejecutando ejecutables
Para ejecutar el script, generalmente hay varias formas.
./my_script_name
. El.
directorio actual de medios./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 uncsh
script sin esa línea, e intenta ejecutarla en bash con./my_script.csh
, fallará)$PATH
variable, puede ejecutarlo simplemente llamando al nombre. Puede llamar alchmod
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. filename.sh
osource 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 importanEjemplos
Ejemplo # 1, ejecutando con intérprete, para ejecutar permisos
Ejemplo # 2, ejecutando con
./
conjunto de permisos ejecutables, conjunto de líneas shebang.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)
Ejemplo # 4, ejecutando script que tiene permisos ejecutables configura la carpeta de formulario que es parte de la
$PATH
variableEjemplo # 5, eliminando la extensión, todavía se ejecuta porque las extensiones no importan, pero tiene permisos y es parte de
$PATH
:fuente
PATH
?man chmod
para ver cómo establecer permisosBuenas explicaciones aquí ya. Solo quería agregar que idealmente no debería usar extensiones de archivo para ejecutables.
Por lo general, necesita lograr algo relativamente fácil y comienza con un pequeño script de shell. Con el tiempo, comienza a agregar más y más funcionalidades a su secuencia de comandos, hasta que llega un momento en que no se puede mantener o necesita alguna funcionalidad que no puede lograr fácilmente con una secuencia de comandos de shell y piensa en volver a escribir esta secuencia de comandos de shell en otro idioma (python , perl, ...?).
Reescribir desde cero generalmente se considera un error, pero para los scripts puede tener sentido porque generalmente no son tan grandes o tienen mucha funcionalidad. Pero supongamos que es posible reescribir desde cero en algún otro idioma, manteniendo la funcionalidad y los parámetros / indicadores del script de shell inicial.
Los usuarios de este script no necesitan estar al tanto de este cambio de idioma, seguirán ejecutando el mismo comando y continuará funcionando.
Si su script fue nombrado
do-something.sh
, puede seguir siéndolodo-something.sh
, pero ahora está escrito en python (por ejemplo), por lo que su sugerencia inicial ahora es totalmente engañosa.fuente
Para ejecutar archivos sin una extensión que normalmente no necesita hacer mucho, solo asegúrese de tener (en caso de scripts de bash) la línea shebang adecuada en la primera línea:
entonces también necesita hacer que el archivo sea ejecutable para el sistema
Esto es lo mismo que usar
chmod +x yourfilename
los números que se explican fácilmente.Es un número triple de octales agregados, el primer número representa al usuario, el segundo para el grupo y el tercero para los demás, más sobre eso puede encontrar aquí .
Y si está en el mismo directorio que su script, no olvide usarlo
./
así:fuente
El sufijo .sh en realidad puede interferir, porque para ejecutarlo debe escribir myscript.sh en lugar de solo myscript, que no funcionará. Es mejor llamarlo "myscript" sin el sufijo .sh, y un uso rápido del comando "file" le dirá si es un ejecutable binario (formato ELF en Linux) o un script de shell, o cualquier otro tipo de script.
QDOS (Sistema operativo rápido y sucio, más tarde renombrado a "DOS" por IBM después de que mirosoft lo pirateó y se lo vendió ilegalmente) y otras estafas baratas de CP / M, incluidas las ventanas, mezclan todo esto porque en esos sistemas no hay tales como ejecutar permisos en archivos. Esto ha resultado en innumerables f'ups de seguridad en los últimos 30-40 años. En realidad, hace solo unos minutos, recibí varios correos basura con un archivo zip atrapado con un piquete renombrado a MYPICTURE.JPG.zip :)
fuente