Comment exécuter un script shell sans utiliser les commandes "sh" ou "bash"?

261

J'ai un script shell que je veux exécuter sans utiliser les commandes "sh" ou "bash". Par exemple:

Au lieu de: sh script.sh

Je veux utiliser: script.sh

Comment puis-je faire ceci?

PS (i) Je n'utilise pas beaucoup le script shell et j'ai essayé de lire sur les alias, mais je n'ai pas compris comment les utiliser.

(ii) J'ai également lu comment lier le script à un autre fichier dans les variables PATH. J'utilise mon serveur universitaire et je n'ai pas l'autorisation de créer un fichier à ces emplacements.

Rameez Hussain
la source
1
Les réponses indiquent comment rendre le script exécutable, mais ne semblent pas couvrir comment le rendre accessible. Pour cela, créez vous-même un répertoire bin - $HOME/bin- si vous n'en avez pas déjà un, ajoutez-le à votre PATH (près du devant). Placez les scripts (et tout autre programme) que vous souhaitez exécuter directement sans spécifier le chemin d'accès ici, ou des liens symboliques ici vers où se trouvent les programmes réels.
Jonathan Leffler
1
Après avoir suivi la (les) réponse (s) ci-dessous, pour supprimer le ".sh", vous pouvez renommer le fichier: mv example.sh exampleet ensuite examplefonctionner de manière autonome.
PJ Brunet

Réponses:

434

Ajoutez un "shebang" en haut de votre fichier:

#!/bin/bash

Et rendez votre fichier exécutable ( chmod +x script.sh).

Enfin, modifiez votre chemin pour ajouter le répertoire où se trouve votre script:

export PATH=$PATH:/appropriate/directory

(généralement, vous souhaitez $HOME/binstocker vos propres scripts)

fge
la source
Hey, merci pour votre réponse. J'ai essayé ça. Maintenant, je peux l'exécuter sans la commande "sh". Mais je dois encore préfixer la commande avec "./" que je ne veux pas. :)
Rameez Hussain
5
Voir les commentaires sur le chemin. Vous devez mettre votre script dans un répertoire que vous devez ajouter à votre PATH.
fge
2
cela n'a pas fonctionné dans mon cas. mais source script.sha bien fonctionné, ou plutôt source <filename_without_any_extension_type>
MycrofD
4
source ./my-cool-script(ou . ./my-cool-script) polluera la session shell actuelle avec toutes les variables définies dans le script. Le sourcing ne doit pas être utilisé sauf si vous souhaitez modifier explicitement la session shell en définissant des variables d'environnement, en changeant le répertoire, etc.
Daniel Waltrip
3
Si vous êtes sûr que le dossier de script est dans PATH, et qu'il ne fonctionne toujours pas sans ./, vous pouvez avoir une collision de noms. Essayez de renommer.
chorbs
66

Voici quelques-unes des conditions préalables à l'utilisation directe du nom du script:

  1. Ajoutez la she-bang (#!/bin/bash)ligne tout en haut.
  2. Utilisation de chmod u+x scriptnamerendre le script exécutable. (où scriptnameest le nom de votre script)
  3. Placez le script sous le /usr/local/bindossier.
  4. Exécutez le script en utilisant uniquement le nom du script.

Remarque: La raison pour laquelle j'ai suggéré de le placer dans le /usr/local/bindossier est probablement parce que ce chemin sera déjà ajouté à votre PATH variable.

Mettre à jour:

Si vous n'avez pas accès au /usr/local/bindossier, procédez comme suit:

  1. Créez un dossier dans votre répertoire personnel et appelons-le myscripts.
  2. Faites-le ls -lartsur votre répertoire personnel pour identifier le script de démarrage que votre shell utilise. Ce devrait être .profilesoit .bashrc.
  3. Une fois que vous avez identifié le script de démarrage, ajoutez la ligne suivante dans votre script - export set PATH=$PATH:~/myscript.
  4. Une fois ajouté, sourcez votre script de démarrage ou déconnectez-vous et reconnectez-vous.
  5. Exécutez votre script à l'aide de scriptname.
jaypal singh
la source
J'ai essayé de le faire mais je n'ai pas les autorisations pour accéder au dossier / usr / local / bin. J'utilise un ordinateur universitaire.
Rameez Hussain le
1
Pourriez-vous s'il vous plaît me dire ce que vous entendez par "source votre script de démarrage"?
Rameez Hussain
1
Le sourcing du script de démarrage signifie de l'exécuter de sorte que le nouveau paramètre défini sur la variable PATH soit récupéré par le shell. Cela peut être fait en faisant . .bashrc. Autrement dit, mettez simplement .suivi de spacevotre nom de script de démarrage.
jaypal singh
Je ne sais pas quel est le problème avec le système. J'ai créé un nouveau script shell nommé "hello" avec juste un "echo" hello "" dedans. J'ai changé ses autorisations et essayé ./hello. Ça ne marche pas. ça dit-
Rameez Hussain
Quelles modifications avez-vous apportées à vos scripts de démarrage?
jaypal singh
20

Assurez-vous simplement qu'il est exécutable, en utilisant chmod +x. Par défaut, le répertoire actuel n'est pas sur votre PATH, vous devrez donc l'exécuter en tant que ./script.sh- ou le référencer autrement par un chemin qualifié. Alternativement, si vous en avez vraiment besoin script.sh, vous devrez l'ajouter à votre CHEMIN. (Vous n'avez peut-être pas accès pour modifier le chemin d'accès système, mais vous pouvez presque certainement modifier le CHEMIN de votre propre environnement actuel.) Cela suppose également que votre script commence par quelque chose comme #!/bin/sh.

Vous pouvez également utiliser un alias, qui n'est pas vraiment lié au script shell mais uniquement au shell, et qui est simple:

alias script.sh='sh script.sh'

Ce qui vous permettrait d'utiliser simplement script.sh(littéralement - cela ne fonctionnera pas pour tout autre *.shfichier) au lieu de sh script.sh.

ziesemer
la source
Hey! Merci pour votre réponse. J'ai essayé d'utiliser des alias plus tôt. Mais rien ne s'est passé. Je l'ai placé immédiatement après la ligne "#! / Usr / local / bin / bash". Que pensez-vous qui ne va pas?
Rameez Hussain
1
Un alias ne peut pas être défini dans votre script - il doit être déclaré comme faisant partie de votre environnement actuel. Il suffit donc d'exécuter la aliascommande à l'invite du shell, puis l'alias sera disponible pour exécuter la commande avec.
ziesemer
17

Dans cet exemple, le fichier sera appelé myShell

Tout d'abord, nous devrons créer ce fichier, nous pouvons simplement commencer en tapant ce qui suit:

sudo nano myShell

Remarquez que nous n'avons pas mis l' .shextension? En effet, lorsque nous l'exécutons à partir du terminal, nous n'aurons besoin que de taper myShellpour exécuter notre commande!

Maintenant, dans nano, la ligne supérieure DOIT être #!/bin/bashalors vous pouvez laisser une nouvelle ligne avant de continuer.

Pour la démonstration j'ajouterai une Hello World!réponse basique

Donc, je tape ce qui suit:

echo Hello World!

Après cela, mon exemple devrait ressembler à ceci:

#!/bin/bash
echo Hello World!

Maintenant, enregistrez le fichier, puis exécutez cette commande:

sudo chmod +x myShell

Nous avons maintenant rendu le fichier exécutable vers lequel nous pouvons le déplacer /usr/bin/en utilisant la commande suivante:

sudo cp myShell /usr/bin/

Juste pour nous assurer que la machine peut l'exécuter correctement, nous devrons redémarrer la machine

j'ai utilisé sudo shutdown -r now

Félicitations! Notre commande est maintenant terminée! Dans le terminal on peut taper myShellet il faut direHello World!

tripleee
la source
1
Vous ne devez pas mettre vos propres fichiers dans /usr/bin- de nombreux systèmes tave /usr/local/binà cet effet et réserver /usr/binstrictement pour le système d'exploitation.
tripleee
Vous n'avez pas besoin de sudo chmodvotre propre fichier.
tripleee
Il n'est pas nécessaire de redémarrer la machine. Tout au plus, vous devriez vous
réapprovisionner
14

Vous devez activer le bit exécutable pour le programme.

chmod +x script.sh

Ensuite, vous pouvez utiliser ./script.sh

Vous pouvez ajouter le dossier au CHEMIN dans votre .bashrcfichier (situé dans votre répertoire personnel). Ajoutez cette ligne à la fin du fichier:

export PATH=$PATH:/your/folder/here
Uku Loskit
la source
J'ai oublié de mentionner que j'ai déjà défini les bonnes autorisations. J'ai utilisé la commande "chmod 755 script.sh"
Rameez Hussain
6

Vous pouvez taper sudo install (nom du script) / usr / local / bin / (ce que vous voulez taper pour exécuter ledit script)

ex: sudo install quickcommit.sh /usr/local/bin/quickcommit entrez le mot de passe

peut maintenant fonctionner sans .sh et dans n'importe quel répertoire

JoelWass
la source
3

Ajouter . (répertoire actuel) à votre variable PATH.
Vous pouvez le faire en modifiant votre fichier .profile.
mettez la ligne suivante dans votre fichier
PATH=$PATH:.

.profile Assurez-vous simplement d'ajouter la ligne Shebang ( #!/bin/bash) au début de votre script et de rendre le script exécutable (en utilisant chmod +x <File Name>).

Arpit Tyagi
la source
0

Voici mon script de sauvegarde qui vous donnera l'idée et l'automatisation:

Serveur: Ubuntu 16.04 PHP: 7.0 Apache2, Mysql etc ...

# 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

changez / home / user dans votre répertoire utilisateur et tapez: backupscript n'importe où sur le terminal pour exécuter le script! (en supposant que / usr / bin se trouve sur votre chemin)

Tarik
la source
0

Entrez "#!/bin/sh"avant le script. Enregistrez-le ensuite comme script.shpar exemple. copiez-le dans $HOME/bin ou $HOME/usr/bin
Le répertoire peut être différent sur différentes distributions Linux mais ils se terminent par 'bin' et se trouvent dans le répertoire personnel cd $HOME/bin ou $HOME/usr/bin
Type chmod 700 script.sh
Et vous pouvez l'exécuter en tapant simplement run.sh sur le terminal. Si cela ne fonctionne pas, essayez chmod +x run.sh au lieu de chmod 700 run.sh

Gyan Prakash
la source
Les parties de cette réponse qui ne reprennent pas les informations des très anciennes réponses existantes sont confuses.
tripleee
0

Rendre n'importe quel fichier exécutable


Disons que vous avez un fichier exécutable appelé migrate_linux_amd64 et que vous souhaitez exécuter ce fichier en tant que commande comme "migrer"

  1. Testez d'abord le fichier exécutable à partir de l'emplacement du fichier:
[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. Assurez-vous que vous disposez des privilèges d'exécution sur le fichier
    -rwxr-xr-x 1 oracle oinstall 7473971 May 18 2017 migrate.linux-amd64
    sinon, exécutezchmod +x migrate.linux-amd64

  2. Copiez ensuite votre fichier dans /usr/local/bin. Ce répertoire appartient à root, utilisez sudo ou passez à root et effectuez l'opération suivante

sudo cp migrate.linux-amd64 /usr/local/bin
sudo chown oracle:oracle /user/local/bin/migrate.linux.amd64
  1. Créez ensuite un lien symbolique comme ci-dessous
sudo ln /usr/local/bin/migrate.linux.amd64 /usr/local/bin/migrate
sudo chown oracle:oracle /usr/local/bin/migrate
  1. Enfin, ajoutez / usr / local / bin à votre chemin ou profil utilisateur
export PATH = $PATH:/usr/local/bin
  1. Exécutez ensuite la commande en tant que "migrer"
[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
Gourou
la source
-1

Juste:

/path/to/file/my_script.sh
DimiDak
la source