Come posso eseguire uno script di shell senza usare i comandi "sh" o "bash"?


261

Ho uno script di shell che voglio eseguire senza usare i comandi "sh" o "bash". Per esempio:

Invece di: sh script.sh

Voglio usare: script.sh

Come posso fare questo?

PS (i) Non uso molto lo script di shell e ho provato a leggere sugli alias, ma non ho capito come usarli.

(ii) Ho anche letto del collegamento dello script con un altro file nelle variabili PATH. Sto usando il mio server universitario e non ho i permessi per creare un file in quelle posizioni.


1
Le risposte indicano come rendere lo script eseguibile, ma non sembrano coprire come renderlo accessibile. Per questo, crea te stesso una cartella bin - $HOME/bin- se non ne hai già una, aggiungila al tuo PERCORSO (vicino alla parte anteriore). Inserisci gli script (e tutti gli altri programmi) che desideri eseguire direttamente senza specificare il percorso qui, o i collegamenti simbolici qui dove si trovano i programmi effettivi.
Jonathan Leffler

1
Dopo aver seguito le risposte seguenti, per eliminare ".sh" è possibile rinominare il file: mv example.sh examplee quindi exampledovrebbe funzionare da solo.
PJ Brunet,

Risposte:


434

Aggiungi un "shebang" nella parte superiore del tuo file:

#!/bin/bash

E rendi il tuo file eseguibile ( chmod +x script.sh).

Infine, modifica il tuo percorso per aggiungere la directory in cui si trova lo script:

export PATH=$PATH:/appropriate/directory

(in genere, si desidera $HOME/binmemorizzare i propri script)


Ehi, grazie per la tua risposta. L'ho provato. Ora posso eseguirlo senza il comando "sh". Ma devo ancora aggiungere il prefisso al comando "./" che non voglio. :)
Rameez Hussain,

5
Vedi commenti sul percorso. Devi mettere il tuo script in una directory che devi aggiungere al tuo PERCORSO.
fge

2
non ha funzionato nel mio caso. ma ha source script.shfunzionato bene, o meglio source <filename_without_any_extension_type>
MycrofD

4
source ./my-cool-script(o . ./my-cool-script) inquinerà la sessione di shell corrente con qualsiasi variabile definita nello script. Il sourcing non deve essere utilizzato a meno che non si desideri modificare esplicitamente la sessione della shell impostando var d'ambiente, cambiando la directory, ecc. Potrebbero verificarsi errori davvero terribili, poiché le variabili di un'esecuzione di uno script, se eseguite tramite sourcing, potrebbero influire su un'altra esecuzione dello script.
Daniel Waltrip,

3
Se sei sicuro che la cartella degli script sia in PERCORSO e non funziona ancora senza ./, allora potresti avere una collisione di nomi. Prova a rinominare.
Chorbs

66

Questi sono alcuni dei prerequisiti per l'utilizzo diretto del nome dello script:

  1. Aggiungi la she-bang (#!/bin/bash)riga in alto.
  2. Utilizzando chmod u+x scriptnamerendere eseguibile lo script. (dov'è scriptnameil nome della tua sceneggiatura)
  3. Posiziona lo script nella /usr/local/bincartella.
  4. Esegui lo script usando solo il nome dello script.

Nota: il motivo per cui ho suggerito di metterlo nella /usr/local/bincartella è perché molto probabilmente sarà il percorso già aggiunto al tuo PATH variable.

Aggiornare:

Se non hai accesso alla /usr/local/bincartella, procedi come segue:

  1. Crea una cartella nella tua home directory e chiamiamola myscripts.
  2. Esegui ls -lartsulla tua home directory, per identificare lo script di avvio utilizzato dalla tua shell. Dovrebbe essere .profileo .bashrc.
  3. Una volta identificato lo script di avvio, aggiungi la seguente riga nel tuo script - export set PATH=$PATH:~/myscript.
  4. Una volta aggiunto, procedi con lo script di avvio o esci e accedi nuovamente.
  5. Esegui il tuo script usando scriptname.

Ho provato a farlo ma non ho i permessi per accedere alla cartella / usr / local / bin. Sto usando un computer universitario.
Rameez Hussain,

1
Potresti dirmi cosa intendi per "fonte del tuo script di avvio"?
Rameez Hussain,

1
Sourcing dello script di avvio significa eseguirlo in modo che il parametro appena impostato su variabile PATH sia raccolto dalla shell. Questo può essere fatto facendo . .bashrc. Cioè, basta inserire .seguito da spacee quindi il nome dello script di avvio.
jaypal singh

Non so quale sia il problema con il sistema. Ho creato un nuovo script di shell chiamato "ciao" con solo un "eco" ciao "". Ho cambiato le sue autorizzazioni e ho provato ./hello. Non funziona. dice-
Rameez Hussain l'

Quali modifiche hai apportato ai tuoi script di avvio?
jaypal singh

20

Assicurati solo che sia eseguibile, usando chmod +x. Per impostazione predefinita, la directory corrente non si trova sul PERCORSO, quindi sarà necessario eseguirla come ./script.sh- o altrimenti fare riferimento a un percorso qualificato. In alternativa, se ne hai davvero bisogno script.sh, dovresti aggiungerlo al tuo PERCORSO. (Potresti non avere accesso a modificare il percorso del sistema, ma puoi quasi certamente modificare il PERCORSO del tuo ambiente attuale.) Ciò presuppone anche che lo script inizi con qualcosa di simile #!/bin/sh.

Puoi anche usare un alias, che non è realmente correlato allo scripting della shell ma solo alla shell, ed è semplice come:

alias script.sh='sh script.sh'

Che ti permetterebbe di usare semplicemente script.sh(letteralmente - questo non funzionerà per nessun altro *.shfile) invece di sh script.sh.


Hey! Grazie per la tua risposta. Ho provato a utilizzare gli alias in precedenza. Ma non è successo niente. L'ho inserito subito dopo la riga "#! / Usr / local / bin / bash". Cosa pensi sia sbagliato?
Rameez Hussain,

1
Non è possibile definire un alias all'interno dello script, ma deve essere dichiarato come parte dell'ambiente corrente. Quindi basta eseguire il aliascomando al prompt della shell, quindi l'alias sarà disponibile per eseguire il comando.
Ziesemer,

17

In questo esempio verrà chiamato il file myShell

Prima di tutto avremo bisogno di creare questo file, possiamo solo iniziare digitando quanto segue:

sudo nano myShell

Notate che non abbiamo inserito l' .shestensione? Questo perché quando lo eseguiamo dal terminale dovremo solo digitare myShellper eseguire il nostro comando!

Ora, in nano la riga superiore DEVE essere #!/bin/bashallora puoi lasciare una nuova linea prima di continuare.

Per la dimostrazione aggiungerò una Hello World!risposta di base

Quindi, scrivo quanto segue:

echo Hello World!

Dopodiché il mio esempio dovrebbe apparire così:

#!/bin/bash
echo Hello World!

Ora salva il file e quindi esegui questo comando:

sudo chmod +x myShell

Ora abbiamo reso eseguibile il file in cui possiamo spostarlo /usr/bin/ utilizzando il seguente comando:

sudo cp myShell /usr/bin/

Solo per essere sicuri che la macchina possa eseguirla correttamente avremo bisogno di riavviare la macchina

ero solito sudo shutdown -r now

Congratulazioni! Il nostro comando è ora terminato! Nel terminale possiamo digitare myShelle dovrebbe direHello World!


1
Non dovresti inserire i tuoi file /usr/bin: molti sistemi salvano /usr/local/bina questo scopo e si riservano /usr/binstrettamente al sistema operativo.
Tripleee,

Non è necessario il sudo chmodtuo file.
triplo

Non è necessario riavviare il computer. Al massimo dovresti ricominciare da capo
Luca Di Liello il

14

Devi abilitare il bit eseguibile per il programma.

chmod +x script.sh

Quindi puoi usare ./script.sh

Puoi aggiungere la cartella al PERCORSO nel tuo .bashrcfile (situato nella tua home directory). Aggiungi questa riga alla fine del file:

export PATH=$PATH:/your/folder/here

Ho dimenticato di dire che ho già impostato le autorizzazioni giuste. Ho usato il comando "chmod 755 script.sh"
Rameez Hussain l'

6

È possibile digitare sudo install (nome dello script) / usr / local / bin / (cosa si desidera digitare per eseguire detto script)

es: sudo install quickcommit.sh /usr/local/bin/quickcommit inserire la password

ora può essere eseguito senza .sh e in qualsiasi directory


3

Inserisci . (directory corrente) alla variabile PATH.
Puoi farlo modificando il tuo file .profile.
inserisci la seguente riga nel tuo file .profile
PATH=$PATH:.

Assicurati di aggiungere la riga Shebang ( #!/bin/bash) all'inizio del tuo script e rendi lo script eseguibile (usando chmod +x <File Name>).


0

Ecco il mio script di backup che ti darà l'idea e l'automazione:

Server: Ubuntu 16.04 PHP: 7.0 Apache2, Mysql ecc ...

# Make Shell Backup Script - Bash Backup Script
    nano /home/user/bash/backupscript.sh
        #!/bin/bash
        # Backup All Start
        mkdir /home/user/backup/$(date +"%Y-%m-%d")
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/etc_rest.zip /etc -x "*apache2*" -x "*php*" -x "*mysql*"
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/etc_apache2.zip /etc/apache2
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/etc_php.zip /etc/php
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/etc_mysql.zip /etc/mysql
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/var_www_rest.zip /var/www -x "*html*"
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/var_www_html.zip /var/www/html
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/home_user.zip /home/user -x "*backup*"
        # Backup All End
        echo "Backup Completed Successfully!"
        echo "Location: /home/user/backup/$(date +"%Y-%m-%d")"

    chmod +x /home/user/bash/backupscript.sh
    sudo ln -s /home/user/bash/backupscript.sh /usr/bin/backupscript

cambia / home / user nella tua directory utente e digita: backupscript ovunque sul terminale per eseguire lo script! (supponendo che / usr / bin sia nel tuo percorso)


0

Inserisci "#!/bin/sh"prima dello script. Quindi salvalo come script.shad esempio. copiarlo in $HOME/bin o $HOME/usr/bin
La directory può essere diversa su diverse distribuzioni di Linux, ma terminano con 'bin' e sono nella home directory cd $HOME/bin o $HOME/usr/bin
Tipo chmod 700 script.sh
E puoi eseguirla semplicemente digitando run.sh sul terminale. Se non funziona, prova chmod +x run.sh invece di chmod 700 run.sh


Le parti di questa risposta che non riformulano le informazioni da risposte esistenti molto vecchie sono confuse.
Tripleee

0

Rendi qualsiasi file eseguibile


Supponiamo che tu abbia un file eseguibile chiamato migrate_linux_amd64 e desideri eseguire questo file come un comando come "migrate"

  1. Prima prova il file eseguibile dal percorso del file:
[oracle@localhost]$ ./migrate.linux-amd64 
Usage: migrate OPTIONS COMMAND [arg...]
       migrate [ -version | -help ]

Options:
  -source          Location of the migrations (driver://url)
  -path            Shorthand for -source=file://path 
  -database        Run migrations against this database (driver://url)
  -prefetch N      Number of migrations to load in advance before executing (default 10)
  -lock-timeout N  Allow N seconds to acquire database lock (default 15)
  -verbose         Print verbose logging
  -version         Print version
  -help            Print usage

Commands:
  goto V       Migrate to version V
  up [N]       Apply all or N up migrations
  down [N]     Apply all or N down migrations
  drop         Drop everyting inside database
  force V      Set version V but don't run migration (ignores dirty state)
  version      Print current migration version
  1. Assicurati di avere i privilegi di esecuzione sul file in
    -rwxr-xr-x 1 oracle oinstall 7473971 May 18 2017 migrate.linux-amd64
    caso contrario, eseguichmod +x migrate.linux-amd64

  2. Quindi copia il tuo file in /usr/local/bin. Questa directory appartiene a root, usa sudo o passa a root ed esegui la seguente operazione

sudo cp migrate.linux-amd64 /usr/local/bin
sudo chown oracle:oracle /user/local/bin/migrate.linux.amd64
  1. Quindi creare un collegamento simbolico come di seguito
sudo ln /usr/local/bin/migrate.linux.amd64 /usr/local/bin/migrate
sudo chown oracle:oracle /usr/local/bin/migrate
  1. Infine aggiungi / usr / local / bin al tuo percorso o profilo utente
export PATH = $PATH:/usr/local/bin
  1. Quindi esegui il comando come "migra"
[oracle@localhost]$ migrate
Usage: migrate OPTIONS COMMAND [arg...]
       migrate [ -version | -help ]

Options:
  -source          Location of the migrations (driver://url)
  -path            Shorthand for -source=file://path 
  -database        Run migrations against this database (driver://url)
  -prefetch N      Number of migrations to load in advance before executing (default 10)
  -lock-timeout N  Allow N seconds to acquire database lock (default 15)
  -verbose         Print verbose logging
  -version         Print version
  -help            Print usage

Commands:
  goto V       Migrate to version V
  up [N]       Apply all or N up migrations
  down [N]     Apply all or N down migrations
  drop         Drop everyting inside database
  force V      Set version V but don't run migration (ignores dirty state)
  version      Print current migration version

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.