Qual è la differenza tra l'esecuzione di uno script bash utilizzando sh e ./

La stessa domanda può sorgere quando si utilizza qualsiasi tipo di script, non solo quelli bash. C'è una grande differenza tra l'esecuzione di uno script tramite l'interprete e l'esecuzione diretta?

Un altro mistero che sveleremo in questo interessante post di Let's Use Linux (uL).


Quando esegui uno script passando il nome del file dello script a un interprete (sh, python, perl, ecc.), In realtà stai eseguendo l'interprete, passando il programma che vuoi eseguire come argomento. Ad esempio, eseguiamo l'interprete sh passandogli l'argomento miscript.sh.

sh mioscript.sh

Se esegui lo script da solo, il sistema chiamerà l'interprete di cui ha bisogno e, quindi, sì, eseguirà lo script, passandolo come argomento all'interprete, ma tutto automaticamente e senza che l'utente che lo ha eseguito lo sappia.

./myscript.sh

Per eseguire uno script da solo, devono essere soddisfatte 2 condizioni:

1) lo script deve includere una "linea bang". Questa è la prima riga di uno script, che deve iniziare con i caratteri #! e che è necessario specificare il percorso in cui si trova l'interprete. È importante notare che questa condizione è vera per qualsiasi tipo di script (python, perl, ecc.), Non solo per quelli di bash.

Pertanto, ad esempio, il nostro script dovrebbe contenere quanto segue come prima riga:

#! / Bin / bash

2) il file deve avere i permessi di esecuzione:

Per concedere i permessi di esecuzione al nostro script, dobbiamo scrivere:

chmod a + x miscript.sh

Pronto, ora eseguilo in questo modo:

./myscript.sh

Oppure copiando lo script in un percorso "speciale" che gli consenta di essere facilmente richiamato. Ad esempio, possiamo copiarlo in / usr / sbin ed eseguirlo da qualsiasi luogo senza includere il percorso completo in cui si trova:

Copiamo:

sudo cp miscript.sh / usr / sbin / miscript

Eseguiamo:

errore

Come puoi vedere, in realtà quello che succede dietro le quinte è molto simile in entrambi i casi. Tuttavia, includendo una "linea bang", i tuoi script saranno molto più facili da distribuire, poiché gli utenti non dovranno ricordare il percorso in cui si trovano gli interpreti necessari per poterli eseguire. Conclusione: è fondamentalmente una questione di comfort.


Lascia un tuo commento

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati con *

*

*

  1. Responsabile dei dati: Miguel Ángel Gatón
  2. Scopo dei dati: controllo SPAM, gestione commenti.
  3. Legittimazione: il tuo consenso
  4. Comunicazione dei dati: I dati non saranno oggetto di comunicazione a terzi se non per obbligo di legge.
  5. Archiviazione dati: database ospitato da Occentus Networks (UE)
  6. Diritti: in qualsiasi momento puoi limitare, recuperare ed eliminare le tue informazioni.

  1.   Oswaldo Villarroel suddetto

    Sono d'accordo con te Erpower, sia la versione dell'interprete che il suo percorso sono variabili e non costanti, a maggior ragione se si considera che le distribuzioni GNU / Linux non sono le uniche che utilizzano Bash (ci sono anche: freeBSD, OpenSolaris, Mac) e tante di loro hanno diverse configurazioni o percorsi.

    L'importante è sapere di avere la flessibilità (come hai detto bene) per giocare con la chiamata allo script, sia con ./ che con sh (o python ... ecc.)

  2.   lui_che_sa@gmail.com suddetto

    Bash è un programma per computer la cui funzione è interpretare gli ordini.

    Si basa sulla shell Unix ed è conforme a POSIX.

    d'altra parte, sh è un programma per computer la cui funzione è interpretare gli ordini.
    Incorpora funzionalità come il controllo del processo, il reindirizzamento
    input / output, elenco e lettura di file, protezione,
    comunicazioni e un linguaggio di comando per scrivere programmi da
    batch o script. Era l'interprete utilizzato nelle prime versioni di Unix ed è diventato uno standard de facto.

  3.   Diana C. suddetto

    Ciao, sono un principiante che usa gli script e vorrei sapere se qualcuno può aiutarmi con un problema che ho:

    Sto gestendo un programma che richiede l'inserimento di diversi dati iniziali tramite console e ho scoperto che tramite uno script è possibile eseguire il programma con i dati iniziali, in modo da non doverlo riscrivere più e più volte quando ho bisogno di eseguire il programma.

    Non so come farlo, quindi se qualcuno mi può aiutare in questo sarò molto grato.

  4.   Usiamo Linux suddetto

    Vedi, dipende dal linguaggio di programmazione in cui stai scrivendo lo script. Comunque quello che ti serve è:

    1) Se si desidera che l'utente debba inserire quei dati ogni volta che lo script viene eseguito, la procedura più comune è che una variabile prenda i valori inseriti nell'input.

    2) Nel caso in cui i valori siano sempre gli stessi, è possibile utilizzare le costanti.

    3) Un'altra opzione è la possibilità che il tuo script possa prendere parametri.

    Saluti! Paolo.

  5.   Usiamo Linux suddetto

    È interessante quello che dici. Si chiama delle 2 forme: linea shebang o direttamente bang line. Ti do le informazioni: http://python.about.com/od/programmingglossary/g/defbangline.htm
    Saluti! Paolo.

  6.   @llomelamomario suddetto

    Interessante, non mi ero mai fermato a pensare a quel dettaglio. Sarebbe interessante vedere più articoli sul ritocco del consolatore, tra cui la famosa ricompilazione del kernel per rimuovere i chili di codice non necessari che sono lì solo per compatibilità e migliorare la velocità del sistema.

  7.   Usiamo Linux suddetto

    VA BENE. Lo terro 'a mente.
    Saluti! Paolo.

  8.   Usiamo Linux suddetto

    Sono contento che abbia funzionato. Cerco sempre di pubblicare cose che penso possano essere interessanti e pratiche.
    Un abbraccio! Paolo.

  9.   Félix Manuel Brito Amarante suddetto

    Ogni programmatore con buone abitudini aggiunge una "riga bang" alla prima riga di codice. In Python non dimentico mai la codifica e la linea bang.
    #! / usr / bin / python2.7
    # *. * codifica = utf-8 *. *

  10.   diex02 suddetto

    Eccellente, si spera che tu possa pubblicare più informazioni sulla riga di comando, specialmente quando si tratta di compilare o installare da file sorgente (tar.gz, ecc.)

  11.   gio di castro suddetto

    Non avevo mai sentito parlare di "bang line", l'ho sempre conosciuta come Shebang

    http://en.wikipedia.org/wiki/Shebang_%28Unix%29

    saluti

  12.   Jonathan Fernandez suddetto

    nota interessante ... grazie!

  13.   eM Dici eM suddetto

    Che interessante, mi dichiaro totalmente ignorante in programmazione e tutto ciò che riguarda lo script, non avevo idea di come funzionasse, ma ho notato che alcuni hanno quell'header.

  14.   Mario raimondi suddetto

    Una precisazione che mi è capitata che ha a che fare con questa voce: volevo installare un gadget adobe air (un calcolatore di probabilità del poker). Quello che fa il programma di installazione di Adobe Air è eseguire lo script corrispondente con "su" ma nella forma ./ chiedendoti la password di root. Poiché lo script non aveva i permessi di esecuzione, ha lanciato il permesso negato, la soluzione: esegui lo script con sh se non vuoi cambiare i permessi (più velocemente che andare alla cartella tmp chmod e tutto il resto). Lì lo script viene eseguito, chiama il programma di installazione di Adobe e un'altra cosa farfalla.

  15.   Ero Sennin suddetto

    Articolo molto interessante! Grazie per avermi aiutato a saperne di più sulla console. Vediamo se continui a pubblicare articoli come questi ^^.
    Continuate così, questo è senza dubbio il mio blog preferito !!

  16.   potere suddetto

    Tieni presente che potrebbero esserci differenze tra le versioni dell'interprete utilizzate. Eseguendo lo script direttamente in base allo shebang non c'è modo di indicare quale versione dell'interprete usare, che potrebbe essere necessaria. Se invece esegui l'interprete e passi lo script come parametro, sai quale versione è in esecuzione.

    Ad esempio in Python, se lo shebang è #! / Usr / bin / python2.4 il programma verrà eseguito in modo diverso rispetto a #! / Usr / bin / python2.6 o se è #! / Usr / bin / python (che di solito è un collegamento simbolico alla versione di Python installata e configurata per impostazione predefinita). Ciò si verifica perché Python 2.6 ha una nuova funzionalità che non esisteva in Python 2.4, quindi scrivere uno script che utilizza quella funzionalità che indica uno shebang #! / Usr / bin / python fallirà se il sistema ha solo python 2.4 installato. Invece, puoi sempre forzare l'esecuzione dello script con la versione di python che desideri avviandolo con "python2.4 /path/al/script.py" o "python2.6 /path/al/script.py/

    Per gli script di shell, ci sono anche differenze tra le shell che usi, quindi l'uso di #! / Bin / sh e #! / Bin / bash può avere risultati diversi a seconda dello script. Se scrivi uno script utilizzando funzionalità che esistono solo in bash ma specifichi un #! / Bin / sh shebang, il tuo script probabilmente funzionerà su Linux (sulla maggior parte delle distribuzioni / bin / sh è un collegamento simbolico a bash) ma probabilmente fallirà in altri UNIX in cui bash non è installato o dove / bin / sh non è un collegamento simbolico a / bin / bash.

    Anche in relazione alla portabilità, si deve tener conto che il percorso indicato nello shebang è assoluto, e ci sono momenti in cui gli interpreti sono installati in altri luoghi. Ad esempio, è comune avere l'interprete python installato in / usr / local / bin / python se hai scaricato e compilato Python invece di utilizzare un pacchetto dalla tua distribuzione. Se il tuo shebang è #! / Usr / bin / python, lo script non funzionerà su quei sistemi. Per cercare di evitare questi problemi, puoi usare come shebang "#! / Usr / bin / env python" (o "#! / Usr / bin / env sh") come spiegato in http://en.wikipedia.org/wiki/Shebang_(Unix)#Portability

  17.   Usiamo Linux suddetto

    Grazie Jonathan! Bello vederti commento!
    Saluti! Paolo.

  18.   antonio suddetto

    Da nessuna parte fa quello che voglio sapere, o almeno non so come rilanciarlo nel motore di ricerca, voglio creare uno script che per un motivo xX esegua il comando aptitude o «su» (è solo un esempio ma sono i 2 casi che Mi viene in mente) e nel caso di aptitude a volte mi chiede di inserire "yon" oppure in "su" mi chiede la password ... Vorrei che lo script selezionasse automaticamente quelle opzioni o passando un parametro o usando qualche metodo che non conosce ... . Grazie per l'attenzione

    1.    usiamo linux suddetto

      Ciao Antonio! Se il tuo problema è dover inserire la password, non credo che ci sia una soluzione. Proprio perché è una misura di sicurezza, quindi non tutti possono installare un programma.
      Per quanto riguarda l'attitudine e il dover mettere sì, penso che possa essere risolto. Non ricordo in questo momento il parametro esatto da usare, ma scoprilo nelle pagine man. Apri un terminale e inserisci il comando: man aptitude.
      Abbraccio! Paolo.

  19.   Davide MM suddetto

    Post molto buono.
    Mi è piaciuto particolarmente -in questo post- che la domanda / dubbio che sorge abbia una risposta molto chiara e concisa.