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.
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.)
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.
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.
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.
È 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.
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.
VA BENE. Lo terro 'a mente.
Saluti! Paolo.
Sono contento che abbia funzionato. Cerco sempre di pubblicare cose che penso possano essere interessanti e pratiche.
Un abbraccio! Paolo.
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 *. *
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.)
Non avevo mai sentito parlare di "bang line", l'ho sempre conosciuta come Shebang
http://en.wikipedia.org/wiki/Shebang_%28Unix%29
saluti
nota interessante ... grazie!
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.
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.
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 !!
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
Grazie Jonathan! Bello vederti commento!
Saluti! Paolo.
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
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.
Post molto buono.
Mi è piaciuto particolarmente -in questo post- che la domanda / dubbio che sorge abbia una risposta molto chiara e concisa.