Perché non rendere eseguibile il file .txt invece del file .sh per eseguire gli script?


18

Mi chiedevo quale fosse la necessità di inserire comandi eseguibili all'interno di un .shfile per creare un singolo script, dal momento che posso fare lo stesso inserendo i comandi all'interno di un .txtfile e rendendolo eseguibile usando chmod.

Suppongo che questo possa essere fatto con una qualsiasi delle estensioni di file. Quindi, sono abbastanza confuso sulla necessità di .shestensione. Qualsiasi aiuto sarebbe molto apprezzato.


19
Tradizionalmente a Unix non interessano le estensioni dei file. Quindi hai ragione: non importa. Puramente per rendere ovvio al lettore che si tratta di una shell script
vidarlo

8
le estensioni di file in Linux non vengono utilizzate dal sistema operativo in alcun modo reale. Mettere un'estensione .sh dice semplicemente all'utente che si tratta di uno script di shell, al contrario di qualche altro tipo di file, come uno script Python o PERL. Personalmente, non inserisco estensioni nei miei script.
doneal24

2
È necessario solo per dire a te o a chiunque altro che lo guarda che è uno script di shell. Se non ti interessa dire quali file .txt sono script da eseguire e quali sono i testi da aprire in un editor, sentiti libero di nominare tutto .txt!
daboross,

2
Right.txt, but.txt if.txt everything.txt limits.txt with.txt the.txt .txt.txt suffix.txt, you.txt not.txt help.txt help.txtself.txt (or.txt anybody.txt else .txt) comprensione.txt what.txt each.txt file.txt is.txt there.txt for.txt.
lasciato circa

1
Questo è simile alla domanda di cui si tratta di un presunto duplicato, ma quella domanda in realtà non risponde a questa.
Kenny Evitt,

Risposte:


47

Non è necessario che l'estensione del file corrisponda a qualcosa di specifico, come hai scoperto correttamente.

Su sistemi simili a Unix, i tipi di file sono generalmente derivati ​​dal contenuto del file (cioè il "numero magico" o altre strutture caratteristiche nei primi byte) e non dal loro nome. Potresti anche omettere completamente l'estensione, che viene spesso eseguita per gli eseguibili.

Controlla il filecomando, ti mostra le informazioni che può trovare su un tipo di file dal suo contenuto.

Per uno script eseguibile, il sistema prevede un cosiddetto "shebang" nella prima riga, che ad esempio assomiglia

#!/usr/bin/env python3

e indica quale programma eseguire come interprete con il file di script come argomento. Se esegui un file di testo senza tale shebang, utilizzerà la shell predefinita, ovvero Bash per provare a interpretarlo.

Quindi sui sistemi Unix / Linux, le estensioni di file sono per lo più un suggerimento (ma nessuna garanzia) per l'utente umano di riconoscere rapidamente cosa aspettarsi che contenga un file specifico. È anche una convenzione che può aiutare, ad esempio, a trovare i file più velocemente.

Si noti tuttavia che esistono alcune eccezioni, in cui il nome e l'estensione sono importanti (ad esempio alcuni file di configurazione del sistema che devono seguire una convenzione di denominazione, oppure molti visualizzatori e editor di immagini richiedono anche l'estensione per indicare il tipo di file).

Puoi anche dare un'occhiata a Le estensioni di file hanno uno scopo (per il sistema operativo)?


3
Le estensioni dei file non contano in una shell, ma in un mondo di sistemi operativi con interfaccia grafica, hai praticamente bisogno che facciano funzionare correttamente il doppio clic.
BallpointBen,

@BallpointBen i due punti non sono correlati. Anche sotto una GUI il "tipo" di un file può essere memorizzato insieme, come metadata, e potrebbe innescare un'esecuzione specifica, indipendentemente dal fatto che l'estensione sia. MacOS non ha estensioni di nomi di file ed è una GUI e sopravvive molto bene ...
Patrick Mevzek

1
@PatrickMevzek come dows MacOS non ha estensioni? Ho abilitato la loro visualizzazione e tutti i file li hanno. Mi sto perdendo qualcosa ? Sono nuovo sulla piattaforma MacOS
Ciprian Tomoiagă,

1
@ CiprianTomoiagă puoi nominare i tuoi file come preferisci, il sistema operativo non ha bisogno dell'estensione per funzionare correttamente su di essi. Vedi ad esempio: howtogeek.com/192628/…
Patrick Mevzek,

1
@bar BBQ indirizzato al minimo comune denominatore ... cosa può andare storto con questo :-) (come attacchi attraverso file allegati e-mail denominati something.com.txt e trucchi per saltare il .txt come .com come significato specifico in Windows-land ). In effetti, per le estensioni dei file di interoperabilità può essere una buona pratica. Bisogna però sapere che questo è chiaramente un difetto introdotto sostanzialmente da DOS e che vari sistemi operativi vivono perfettamente soddisfatti dei file senza estensioni.
Patrick Mevzek,

3

Non esiste un file "estensione" o "tipo" in un nome file UNIX / Linux.

Come altri hanno sottolineato, il "tipo" può essere trovato usando il comando file supponendo che la magia rilevante sia disponibile sul tuo sistema. I nomi di file UNIX / Linux possono normalmente contenere qualsiasi carattere disponibile, ma spesso è utile utilizzare una qualche forma di convenzione per il nome in modo che sia gli umani sia le macchine possano esprimere giudizi sul contenuto (e quindi sull'uso del contenuto).

Ad esempio, utilizzo spesso una virgola come primo carattere del nome del file per indicare un file temporaneo anziché utilizzare qualcosa come la stringa ".tmp" alla fine del nome del file. Il risultato è lo stesso, un file contenente dati che è necessario solo per un breve periodo, ma il nome non richiede di avere un "." al suo interno né la stringa "tmp". Questo a volte può avere dei vantaggi, ad esempio quando si analizza un elenco di nomi di file. Ma è la MIA convenzione e qualcun altro può decidere su un'altra anche usando ".tmp" come convenzione di un nome per un file temporaneo.

Quindi la mia risposta è che non esiste un'estensione di file UNIX / Linux un semplice insieme di convenzioni che in genere assomigliano alle estensioni di file utilizzate in altri sistemi operativi e nei loro file system.


FWIW, uso anche una convenzione non standard per me stesso. I miei script i cui nomi iniziano con "."devono essere punteggiati dalla shell (non possono essere eseguiti in modo significativo in una subshell). Di conseguenza, disabilito la convenzione predefinita "punto iniziale = file nascosto" nei miei alias / script che usano in lsmodo da poter vedere tutti i file, compresi quelli "nascosti". Analogamente su Windows, disabilito l'impostazione "nascondi estensioni di file".
jrw32982 supporta Monica
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.