¿Por qué algunos sistemas ejecutarán un .sharchivo 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 .shsería preferible ejecutar los comandos sin ellos.
command-line
scripts
Philip Kirkbride
fuente
fuente

.shEn 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.shcomienza con#!/bin/bash, entonces la ejecuciónsh foo.shlo ejecutará con un intérprete diferente al que está diseñado para ), y si reescribefoo.shpara 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.+xset - dondefoo.shhay una biblioteca que puede obtenerse en cualquier shell POSIX,foo.bashpuede obtenerse en bash,foo.kshen ksh, etc.Respuestas:
Estas confundido. La
.shextensió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.exeerror de Windows .Esto es lo que sucede cuando escribe
foo:Redirección para
STDIN,STDOUTySTDERRestán configurados.El shell comprueba su tabla hash interna para ver si ya conoce una
$PATHentrada parafoo. Si no existe ninguno, el shell busca en los directorios$PATH, buscando un archivo llamadofooque tenga el bit Ejecutar establecido en sus permisos de archivo. Primerofoogana.Si los dos primeros bytes del archivo
fooson#!, la siguiente cadena es el nombre de un intérprete para ejecutar. Por lo tanto,#!/bin/bashintroduce un script Bash,#!/usr/bin/perlintroduce un script Perl, etc.Si el archivo comienza con
\177ELF, es un ejecutable binario y lold.soinicia.Lea
man execveyman ld.sopara una explicación más detallada.fuente
chmod +x) prácticamente resuelve esto, ¿verdad?xbit 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.exeporque siempre desactivo lahide file extensionfunció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
.shextensión para designar que un archivo es un script de shell, o.pypara 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
$PATHvariable 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 uncshscript sin esa línea, e intenta ejecutarla en bash con./my_script.csh, fallará)$PATHvariable, puede ejecutarlo simplemente llamando al nombre. Puede llamar alchmodcomando en la línea de comando simplemente escribiendo su nombre porque está en la/bincarpeta./binsiempre es parte de la$PATHvariable. En este caso, los permisos ejecutables y la ubicación del script son importantes. filename.shosource filename.shhará 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
$PATHvariableEjemplo # 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 chmodpara 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 yourfilenamelos 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