¿Por qué no hacer que el archivo .txt sea ejecutable en lugar del archivo .sh para ejecutar scripts?

18

Me preguntaba cuál es la necesidad de poner comandos ejecutables dentro de un .sharchivo para hacer un solo script, ya que puedo hacer lo mismo poniendo los comandos dentro de un .txtarchivo y haciéndolo ejecutable usando chmod.

Supongo que esto se puede hacer con cualquiera de las extensiones de archivo. Entonces, estoy bastante confundido acerca de la necesidad de .shextensión. Cualquier ayuda sería muy apreciada.

Abhik Bhattacharjee
fuente
19
A Unix tradicionalmente no le importan las extensiones de archivo. Así que tienes razón, no importa. Es puramente para hacer obvio para el lector que es un script de shell
vidarlo
8
El sistema operativo no utiliza extensiones de archivos en Linux de ninguna manera real. Poner una extensión .sh simplemente le dice al usuario que es un script de shell, a diferencia de otro tipo de archivo, como un script de Python o Perl. Personalmente, no pongo extensiones en mis scripts.
doneal24
2
Solo se necesita para decirle a usted o a cualquier otra persona que lo mire que es un script de shell. Si no le importa saber qué archivos .txt son scripts para ejecutar y cuáles son texto para abrir en un editor, ¡no dude en nombrar todo .txt!
daboross
2
Right.txt, pero.txt si.txt todo.txt termina.txt con.txt el.txt .txt.txt sufijo.txt, usted es.txt no.txt ayudando.txt usted mismo.txt (o.txt anybody.txt más .txt) comprensión.txt what.txt cada archivo.txt.txt es.txt there.txt for.txt.
Leftaroundabout
1
Esto es similar a la pregunta de cuál es un supuesto duplicado, pero esa pregunta en realidad no responde a esta.
Kenny Evitt

Respuestas:

47

No es necesario que la extensión del archivo coincida con nada específico, como descubrió correctamente.

En los sistemas tipo Unix, los tipos de archivo generalmente se derivan del contenido del archivo (es decir, el "número mágico" u otras estructuras características en los primeros bytes) y no de su nombre. También puede omitir por completo la extensión, que a menudo se realiza para ejecutables.

Verifique el filecomando, le muestra la información que puede encontrar sobre un tipo de archivo a partir de su contenido.

Para un script ejecutable, el sistema espera un llamado "shebang" en la primera línea, que se ve, por ejemplo, como

#!/usr/bin/env python3

e indica qué programa ejecutar como intérprete con el archivo de script como argumento. Si ejecuta un archivo de texto sin dicho shebang, usará su shell predeterminado, es decir, Bash para intentar interpretarlo.

Entonces, en los sistemas Unix / Linux, las extensiones de nombre de archivo son principalmente una pista (pero no una garantía) para que el usuario humano reconozca rápidamente qué esperar que contenga un archivo específico. También es una convención que puede ayudar, por ejemplo, a encontrar archivos más rápido.

Sin embargo, tenga en cuenta que existen algunas excepciones en las que el nombre y la extensión son importantes (por ejemplo, algunos archivos de configuración del sistema que deben seguir una convención de nomenclatura, o muchos visores y editores de imágenes también requieren que la extensión indique el tipo de archivo).

También puede echar un vistazo a ¿Las extensiones de archivo tienen algún propósito (para el sistema operativo)?

Byte Commander
fuente
3
Las extensiones de archivo no importan en un shell, pero en un mundo de sistemas operativos GUI, prácticamente los necesita para que el doble clic funcione correctamente.
BallpointBen
@BallpointBen los dos puntos no están relacionados. Incluso bajo una GUI, el "tipo" de un archivo puede almacenarse junto, como metadatos, y podría desencadenar una ejecución específica, independientemente de que la extensión sea. MacOS no tiene extensiones de nombres de archivo y es una GUI y la sobrevive muy bien ...
Patrick Mevzek
1
@PatrickMevzek, ¿por qué MacOS no tiene extensiones? Permití mostrarlos y todos los archivos los tienen. Me estoy perdiendo de algo ? Soy nuevo en la plataforma MacOS
Ciprian Tomoiagă
1
@ CiprianTomoiagă puede nombrar sus archivos como quiera, el sistema operativo no necesita la extensión para funcionar correctamente en ellos. Ver por ejemplo: howtogeek.com/192628/…
Patrick Mevzek
1
@barbecue apuntando al mínimo común denominador ... qué puede salir mal con eso :-) (como ataques a través de archivos adjuntos de correo electrónico llamados something.com.txt y haciendo trucos para omitir el .txt como .com como significado específico en Windows-land ) De hecho, para la interoperabilidad, las extensiones de archivo pueden ser una buena práctica. Sin embargo, uno debe aprender que esto es claramente un defecto introducido por DOS básicamente y que varios sistemas operativos viven perfectamente felices con archivos sin extensiones.
Patrick Mevzek
3

No existe una "extensión" o "tipo" de archivo en un nombre de archivo UNIX / Linux.

Como otros han señalado, el "tipo" se puede encontrar usando el comando de archivo asumiendo que la magia relevante está disponible en su sistema. Los nombres de archivos UNIX / Linux normalmente pueden contener cualquier carácter disponible, pero a menudo es útil usar alguna forma de convención para el nombre de modo que tanto los humanos como las máquinas puedan hacer juicios sobre el contenido (y, por lo tanto, el uso del contenido).

Como ejemplo, a menudo uso una coma como primer carácter del nombre del archivo para indicar un archivo temporal en lugar de usar algo como la cadena ".tmp" al final del nombre de archivo. El resultado es el mismo, un archivo que contiene datos que solo se requieren por un corto tiempo, pero el nombre no requiere tener un "." dentro de ella ni la cadena "tmp". Esto a veces puede tener ventajas, por ejemplo, al analizar una lista de nombres de archivo. Pero es MI convención y alguien más puede decidir sobre otra incluso usando ".tmp" como su convención de un nombre para un archivo temporal.

Entonces, mi respuesta es que no existe una extensión de archivo UNIX / Linux, sino un conjunto de convenciones que generalmente se parecen a las extensiones de archivo utilizadas en otros sistemas operativos y sus sistemas de archivos.

PJF
fuente
FWIW, también uso una convención no estándar para mí. Mis scripts cuyos nombres comienzan "."están destinados a ser punteados por el shell (no pueden ejecutarse significativamente en un subshell). En consecuencia, desactivo la convención predeterminada "punto inicial = archivo oculto" en mis alias / scripts que utilizo lspara poder ver todos los archivos, incluidos los "ocultos". De manera similar, en Windows, deshabilito la configuración de "ocultar extensiones de archivo".
jrw32982 apoya a Monica