19 votes

Pourquoi dois-je mettre sh avant d'exécuter les fichiers .sh ?

Quand je veux courir .sh dans le Terminal, je dois mettre sh en face d'eux.

Existe-t-il un moyen d'éviter cela, et donc d'économiser de la frappe ?

24voto

Wolfram Kriesing Points 1141

Si vous exécutez votre script à partir de l'interpréteur de commandes, vous n'avez pas réellement besoin de la balise #!/bin/sh comme indiqué dans ce cette réponse -Tous les systèmes de type Unix que j'ai utilisés, y compris OS X, utilisent par défaut la fonction /bin/sh si aucun interpréteur n'est spécifiquement spécifié (bien que ce soit une bonne idée car les non-shells ne sauront pas comment exécuter votre script à moins que vous ne donniez le shebang).

Vous n'avez pas non plus besoin d'un .sh extension. Vous faire besoin de définir les permissions des exécutables, par ex.

$ chmod +x script.sh

(Le $ est l'invite du shell ; je l'utilise pour illustrer les commandes que vous donnez au shell interactif. Ne le tapez pas)

Cependant, je pense que votre confusion vient du fait que vous avez créé un script, par ex. script.sh dans le répertoire courant, et vous essayez de l'exécuter en tapant simplement script.sh . par exemple

$ cat >script.sh
echo hello, world
^D
$ chmod +x script.sh
$ script.sh
-bash: script.sh: command not found

( ^D signifie control - D . Vous trouverez cette notation dans de nombreux écrits sur l'utilisation d'Unix).

Le fait que script.sh dans ce cas est un shell script n'est que la moitié du problème ; votre vrai problème est que, par défaut, le shell ne cherchera pas un programme dans le répertoire courant. Cependant, ceci fonctionne :

$ sh script.sh
hello, world

parce que sh prend le script comme argument.

Vous pouvez exécuter un script-ou, encore, tout exécutable - dans le répertoire courant, s'il est marqué exécutable (c'est-à-dire chmod +x ), en spécifiant que vous voulez exécuter celui qui se trouve dans le répertoire courant :

$ ./script.sh
hello, world

Vous pouvez également déplacer le script dans un répertoire sur votre ordinateur. PATH . Je recommande /usr/local/bin pour cela si votre script est destiné à être utilisé dans tout le système, ou un bin dans votre maison si le script est uniquement pour vous. Dans ce dernier cas, vous devez ajouter $HOME/bin qui s'étend jusqu'à votre nouveau répertoire bin, à votre PATH en ajoutant les lignes suivantes à votre .profile dans votre répertoire personnel :

PATH=$HOME/bin:$PATH
export PATH

Enfin, vous pouvez, si vous le souhaitez, ajouter le répertoire courant à la liste des fichiers de l'application PATH ce qui vous permettra d'aller dans un répertoire contenant script.sh -ou tout autre exécutable-et tapez

$ script.sh

pour l'exécuter. Cependant, Je ne recommande pas cette pratique En effet, un attaquant peut maintenant vous inciter à exécuter un exécutable arbitraire en déposant un exécutable script (nommé, disons, ls ) dans un répertoire où vous vous trouverez. Si vous realmente Mais si vous voulez le faire, il suffit d'ajouter ce qui suit à votre liste de diffusion .profile :

PATH=.:$PATH
export PATH

10voto

Mark Harrison Points 77152

Vous n'avez pas besoin d'appeler sh si le fichier script est marqué comme exécutable. Dans ce cas, vous pouvez l'appeler par mon nom comme vous le feriez pour toute autre commande du shell existant.


Pour être tout à fait correct, vous devez faire deux choses :

  1. Modifiez votre script pour y inclure un shebang en haut de votre script :

    #!/bin/sh

    ... Cela indiquerait au shell quel interpréteur utiliser pour exécuter le script ; dans ce cas, l'interpréteur /bin/sh exécutable.

  2. Marquer le script comme étant exécutable par vous avec le chmod commandement :

    chmod u+x scriptname.sh

Une fois que vous avez fait ces deux choses, vous devriez être en mesure d'exécuter votre script en tapant le nom du fichier de votre script sur la ligne de commande. Vous devrez être dans le même répertoire que votre script, à moins que vous ne fassiez l'étape supplémentaire d'ajouter le dossier contenant votre Variable PATH . Si vous ne vous souciez pas du shell qui exécute le script, vous n'avez pas besoin de l'étape 1 pour spécifier sh mais il est souvent préférable d'être précis et de fixer le "shebangsh".

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X