Quel shell exécute les scripts quand il n'y a pas de ligne shebang (#! / Path / to / shell) au début? Je suppose que / bin / sh mais je ne peux pas confirmer.
Le noyau refuse d'exécuter ces scripts et retourne ENOEXEC, de sorte que le comportement exact dépend du programme que vous exécutez un tel script à partir .
- bash 4.2.39 - utilise lui-même
- busybox-ash 1.20.2 - utilise lui-même
- dash 0.5.7 - runs / bin / sh
- fish 1.23.1 - se plaint d'ENOEXEC, puis blâme le mauvais fichier
- AT&T ksh 93u + 2012.08.01 - utilise lui-même
- mksh R40f - s'exécute / bin / sh
- pdksh 5.2.14 - exécute / bin / sh
- sh-heirloom 050706 - utilise lui-même
- tcsh 6.18.01 - exécute / bin / sh
- zsh 5.0.0 - exécute / bin / sh
- cmd.exe 5.1.2600 - vous regarde drôle.
Dans la glibc , les fonctions execv()
ou execve()
simplement retournent ENOEXEC. Mais execvp()
cache ce code d'erreur et invoque automatiquement / bin / sh. (Ceci est documenté dans exec (3p) .)
Quelles sont les «meilleures pratiques» en termes d'écriture de scripts shell qui s'exécuteront sur n'importe quelle plate-forme? (ok, c'est en quelque sorte ouvert)
Soit vous vous en tenez aux sh
seules fonctionnalités définies par POSIX, soit vous vous contentez d'aller à bash complet (qui est largement disponible) et de le mentionner dans vos besoins si vous le distribuez.
(Maintenant que j'y pense, Perl - ou peut-être Python - serait encore plus portable, sans parler d'avoir une meilleure syntaxe.)
Ajoutez toujours la ligne Shebang. Si vous utilisez bash ou zsh, utilisez #!/usr/bin/env bash
au lieu de coder en dur le chemin du shell. (Cependant, le shell POSIX est garanti sur /bin/sh
, donc sautez env
dans ce cas.)
(Malheureusement, even /bin/sh
n'est pas toujours le même. Le programme GNU autoconf doit gérer de nombreuses bizarreries différentes .)
Est-il possible d'écrire un script qui essaie d'utiliser zsh et retombe sur bash si zsh n'est pas disponible? J'ai essayé de mettre deux lignes de shebang, comme ci-dessous, mais ça ne fait que des erreurs avec un mauvais interprète: / bin / zsh: aucun fichier ou répertoire de ce type si je l'essaie sur une machine sans zsh.
Il ne peut y avoir qu'une seule ligne de shebang; tout ce qui se trouve après le caractère de nouvelle ligne n'est même pas lu par le noyau et traité comme un commentaire par des shells.
Il est possible d'écrire un script qui s'exécute en tant que #!/bin/sh
, vérifie quel shell est disponible et s'exécute exec zsh "$0" "$@"
ou en exec bash "$0" "$@"
fonction du résultat. Cependant, la syntaxe utilisée par bash et zsh est si différente à divers endroits que je ne recommanderais pas de le faire pour votre propre raison.