Lorsque je veux exécuter des .sh
fichiers dans Terminal, je dois les placer sh
devant eux.
Existe-t-il un moyen d'éviter cela et donc d'économiser la frappe?
Lorsque je veux exécuter des .sh
fichiers dans Terminal, je dois les placer sh
devant eux.
Existe-t-il un moyen d'éviter cela et donc d'économiser la frappe?
Réponses:
Si vous exécutez votre script à partir du shell, vous n'avez pas vraiment besoin du #!/bin/sh
shebang comme indiqué dans cette réponse - chaque système de type Unix que j'ai utilisé, y compris OS X, sera par défaut /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'une .sh
extension. Vous avez besoin de définir des autorisations exécutables, par exemple
$ 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 est que vous avez créé un script, par exemple script.sh
, dans le répertoire courant, et que 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 script shell n'est que la moitié du problème; votre problème réel est que, par défaut, le shell ne recherchera pas le programme actuel pour un programme. Cependant, cela fonctionne:
$ sh script.sh
hello, world
car sh
prend le script comme argument.
Vous pouvez exécuter un script - ou, encore une fois, n'importe quel exécutable - dans le répertoire en cours, s'il est marqué comme exécutable (c'est-à-dire chmod +x
), en spécifiant que vous voulez exécuter celui du répertoire en cours:
$ ./script.sh
hello, world
Vous pouvez également déplacer le script vers un répertoire de votre PATH
. Je recommande /usr/local/bin
pour cela si votre script est destiné à être utilisé à l'échelle du système, ou un bin
répertoire dans votre maison si le script est uniquement pour vous. Ce dernier vous oblige à ajouter $HOME/bin
, qui s'étend à 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 réellement le répertoire courant à votre PATH
, ce qui vous permettra d’aller simplement dans un répertoire contenant script.sh
- ou tout autre exécutable - et de taper
$ script.sh
pour l'exécuter. Cependant, je ne recommande pas cette pratique , car un attaquant peut maintenant vous inciter à exécuter un exécutable arbitraire en déposant un script exécutable (nommé, disons ls
) dans un répertoire dans lequel vous vous trouverez. Si vous voulez vraiment le faire, cependant, ajoutez simplement ce qui suit à votre .profile
:
PATH=.:$PATH
export PATH
sl
ou lls
ou l
... à savoir, les fautes de frappe. Il suffit de laisser .
sur $PATH
. De plus, vous pouvez (ou ne devriez pas) faire nécessairement confiance à tout le monde sur votre système. Par exemple, supposons qu'il existe un exploit qui permet à un attaquant de déposer un fichier arbitraire dans un répertoire, mais qu'il a besoin de vous pour exécuter ce fichier afin de dégénérer en un meilleur exploit (par exemple, collecter des données et appeler le téléphone). Défense en profondeur!
/tmp
un autre répertoire accessible en écriture.
/tmp
et al. venir avec le territoire.
Vous n'avez pas besoin d'appeler sh
si le fichier de script est marqué comme exécutable. Dans ce cas, vous pouvez l'appeler mon nom comme vous le feriez pour n'importe quelle autre commande du shell existant.
Pour être pleinement correct, vous voudrez faire deux choses:
Modifiez votre script pour inclure une directive 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' /bin/sh
exécutable.
Marquez le script comme exécutable par vous avec la commande chmod :
chmod u+x scriptname.sh
Une fois que vous avez effectué ces deux opérations, vous devriez pouvoir exécuter votre script en tapant le nom de 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 preniez également 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 la première étape pour le spécifier, sh
mais il est souvent préférable d'être précis et de définir le "shebangsh".
/bin/sh
, bien qu'ils ne blessent pas.
ksh
scripts à l'époque sur HP-UX - mais il est bon de savoir que ce n'est pas strictement nécessaire.
exec
syscall, vous obtenez ENOEXEC
(erreur de format exec ). Désolé pour ça, @bmike, @ ChrisW.Rea. Je vais modifier ma réponse maintenant.