In Unix, qual è la differenza tra uno script di shell e un eseguibile?


Risposte:


12

Un eseguibile si riferisce a qualsiasi file con il set di bit eseguibile che potrebbe essere eseguito (anche se ci sono errori nell'esecuzione effettiva del programma).

Uno script di shell è un tipo specifico di eseguibile che deve essere interpretato da una shell che utilizza la #!direttiva per specificare un interprete.


12

Uno script è un file che:

  • è leggibile dall'uomo (almeno per un essere umano ragionevolmente addestrato, cioè il file è composto da caratteri stampabili); e
  • è interpretato da un interprete come istruzioni che descrivono il comportamento di un programma.

Uno script di shell è uno script il cui interprete è una shell . Nel mondo unix, "shell" si riferisce alla famiglia di shell che assomigliano alla shell Bourne ; moderne tali conchiglie (ash, bash, ksh, zsh, ...) sono conformi allo standard shell POSIX . Più in generale, la parola "shell" può includere altri interpreti di comandi come csh, tcsh, fish, ...


Un eseguibile è qualsiasi file che può essere eseguito. Per essere efficacemente eseguibile, un file deve avere due proprietà:

  • L'utente deve disporre dell'autorizzazione per eseguirlo. Questo può essere visto con il comando ls -l: il xpersonaggio deve essere presente nella colonna dei permessi.
  • Il formato del file deve essere quello che il sistema riconosce come eseguibile. I formati eseguibili possono essere suddivisi in diverse categorie:

    • Eseguibili nativi, che consistono in codice macchina organizzato secondo il layout eseguibile binario del sistema operativo. La maggior parte dei moderni sistemi unix utilizza il formato ELF per i propri eseguibili nativi.
    • Script. Uno script eseguibile è un file che inizia con una riga shebang , composta dai due caratteri #!seguiti da un percorso a un file. Per eseguire un tale file, il kernel esegue il programma interprete e gli passa il percorso allo script come argomento.
    • Forse altri formati a seconda del sistema. Ad esempio, Linux può registrare formati di file arbitrari tramite la funzione binfmt_misc . Ciò consente ai file bytecode Java di essere eseguiti tramite una JVM registrata , gli eseguibili di Windows da eseguire tramite Wine , ecc.

Si noti che essere un eseguibile dipende dal sistema. Ad esempio, un binario Linux amd64 è eseguibile su un sistema Linux amd64 ma non su un sistema a 32 bit. Un binario per Android non è eseguibile su una normale installazione Linux. Un eseguibile di Windows è eseguibile su Linux solo se Wine è presente. Uno script che inizia con #!/usr/local/bin/rubyè eseguibile solo se è presente un programma in /usr/local/bin/ruby.


Di solito è eseguibile uno script di shell. Ma può essere non eseguibile, se non si dispone dell'autorizzazione per eseguirlo. Puoi ancora averlo interpretato passandolo esplicitamente all'interprete (es. bash /path/to/script) - "farlo interpretare" è un modo elegante di dire "esegui".


2

shell-script:

Uno script di shell è una serie di comandi che verranno interpretati da una shell (di solito sh o una shell sh-compatibile, a volte un'altra).

Il nome dello script può, ma NON è necessario, terminare in ".sh" o ".bash" o ".csh" ecc. (Dando un suggerimento sulla shell da cui dovrebbe essere lanciato).

Per chiarezza, suppongo: il nome dello script è scripte la shell in cui dovrebbe essere lanciato è bash.

Un modo tipico di avviarlo in shell sarebbe quindi: bash /absolute/path/to/the/scripto bash ./relative/path/to/the/script. In questo modo, non è necessario che il bit eseguibile sia impostato, poiché viene letto solo da bash, che quindi esegue il contenuto.

Si può anche essere impostato + x (eseguibile) per consentire di lanciare direttamente dalla sessione di shell corrente con: / assoluto / path / to / la / script (o ./relative/path/to/the/script). Attenzione: per impostazione predefinita, quando viene avviato in questo modo, viene avviato tramite la shell digitata o tramite una shell posix (il comportamento dipende dal sistema operativo), quindi potrebbe non essere la shell da cui dovrebbe essere eseguita. Ecco perché puoi (e dovresti) specificare come prima riga dello script: #! / Path / to / good / shell che indica al tuo sistema operativo che lo script dovrebbe davvero essere lanciato da / path / to / good / shell.

eseguibile:

Un eseguibile è un file con il bit "x" impostato per l'utente / i / i gruppo / i da cui dovrebbe essere avviato. Può essere tipicamente un "binario" o uno script.

Suggerimento: file /some/filepuoi dirti di più sul contenuto del file. Prova file /usr/bin/basho file /etc/profileper vedere alcuni esempi.


La tua affermazione sugli script shebangless eseguiti dalla tua shell corrente non è corretta. Il comportamento dipende dal sistema operativo. In genere, vengono utilizzate una shell POSIX o la shell di accesso.
jlliagre,

Grazie per questa precisione. Modificherò la mia risposta per aggiungere il tuo commento.
Olivier Dulac l'
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.