web-dev-qa-db-fra.com

Quelle est l'extension du fichier Bash?

J'ai écrit un script bash dans un éditeur de texte, quelle est l'extension avec laquelle je sauvegarde mon script pour qu'il puisse s'exécuter en tant que script bash? J'ai créé un script qui devrait en théorie démarrer un serveur ssh. Je me demande comment faire exécuter le script une fois que je clique dessus. Je suis sous OS X 10.9.5. 

50
Amedeo

En désaccord avec les autres réponses, il existe une convention commune consistant à utiliser une extension .sh pour les scripts Shell, mais ce n'est pas une convention utile. Il vaut mieux ne pas utiliser une extension du tout. L'avantage de pouvoir dire que foo.sh est un script Shell, car son nom est minime, et vous le payez avec une perte de flexibilité.

Pour rendre un script bash exécutable, il doit avoir une ligne Shebang en haut:

#!/bin/bash

et utilisez la commande chmod +x pour que le système le reconnaisse comme un fichier exécutable. Il doit ensuite être installé dans l’un des répertoires énumérés dans votre $PATH. Si le script s'appelle foo, vous pouvez ensuite l'exécuter à partir d'une invite du shell en saisissant foo. Ou, s'il se trouve dans le répertoire en cours (commun aux scripts temporaires), vous pouvez taper ./foo.

Ni le shell ni le système d'exploitation ne font attention à la partie extension du nom de fichier. C'est juste une partie du nom. Et en not en lui donnant une extension spéciale, vous vous assurez que quiconque (soit un utilisateur, soit un autre script) l'utilisant n'a pas à se soucier de la façon dont il a été implémenté, qu'il s'agisse d'un script Shell (sh, bash, csh , ou peu importe), un script Perl, Python ou Awk, ou un exécutable binaire. Le système est spécialement conçu pour qu'un script interprété ou un exécutable binaire puisse être appelé sans savoir ou se préoccuper de la façon dont il est implémenté.

Les systèmes de type UNIX ont commencé avec une interface de ligne de commande purement textuelle. Des interfaces graphiques telles que KDE et Gnome ont été ajoutées ultérieurement. Dans un système de bureau à interface graphique, vous pouvez généralement exécuter un programme (qu'il s'agisse d'un script ou d'un exécutable binaire), par exemple en double-cliquant sur une icône qui y fait référence. En règle générale, cela supprime toute sortie imprimée par le programme et ne vous permet pas de passer des arguments en ligne de commande. c'est beaucoup moins flexible que de l'exécuter à partir d'une invite de shell. Mais pour certains programmes (principalement des clients GUI), cela peut être plus pratique.

Les scripts shell s’apprennent mieux à partir de la ligne de commande et non d’une interface graphique.

(Certains outils do sont attentifs aux extensions de fichier. Par exemple, les compilateurs utilisent généralement cette extension pour déterminer le langage dans lequel le code est écrit: .c pour C, .cpp pour c ++, etc. Cette convention ne s’applique pas aux exécutables. des dossiers.)

N'oubliez pas que UNIX (et les systèmes similaires à UNIX) ne sont pas Windows. MS Windows utilise généralement l'extension d'un fichier pour déterminer comment l'ouvrir/l'exécuter. Les exécutables binaires doivent avoir une extension .exe. Si un shell de type UNIX est installé sous Windows, vous pouvez configurer Windows pour qu'il reconnaisse une extension .sh en tant que script Shell et utilise le shell pour l'ouvrir. Windows n'a pas la convention #!.

55
Keith Thompson

Vous n'avez besoin d'aucune extension (ou vous pouvez en choisir une arbitraire, mais .sh est une convention utile).

Vous devriez commencer votre script avec #!/bin/bash (cette première ligne est comprise par execve (2) syscall), et vous devriez rendre votre fichier exécutable par chmod u+x. donc si votre script est dans un fichier $HOME/somedir/somescriptname.sh vous devez taper une fois

 chmod u+x  $HOME/somedir/somescriptname.sh

dans un terminal. Voir chmod (1) pour la commande et chmod (2) pour l'appel système.

Sauf si vous tapez le chemin d'accès au fichier entier, vous devez placer ce fichier dans un répertoire mentionné dans votre PATH(voir environ (7) & execvp (3) ), que peut définir de manière permanente dans votre ~/.bashrc si votre shell de connexion est bashname__)

En passant, vous pouvez écrire votre script dans une autre langue, par exemple. en Python en le démarrant avec #!/usr/bin/python ou en Ocaml en le démarrant avec #!/usr/bin/ocaml...

L'exécution de votre script en double-cliquant (sur quoi? Vous n'avez pas dit!) Est un problème environnement de burea et peut être spécifique au bureau (peut être différente avec Kde, Mate, Gnome, .... ou IceWM ou RatPoison). Peut-être que lire EWMH spec pourrait vous aider à obtenir une meilleure image.

Rendre votre script exécutable avec chmodpourrait peut-être le rendre cliquable sur votre bureau (apparemment, Quartz sur MacOSX). Mais alors, vous devriez probablement lui donner un retour visuel.

Et plusieurs ordinateurs n’ont pas de bureau, y compris le vôtre lorsque vous y accédez à distance avec ssh .

Je ne crois pas que ce soit une bonne idée d'exécuter votre script Shell en cliquant sur. Vous voulez probablement pouvoir donner des arguments à votre script Shell (et comment vous y feriez en cliquant?), Et vous devriez vous soucier de sa sortie. Si vous êtes capable d'écrire un script Shell, vous pouvez utiliser un shell interactif dans un terminal. C'est le moyen le plus naturel et le plus naturel d'utiliser un script. De bons shells interactifs (par exemple zsh ou poisson ou peut-être un récent bashname__) ont-ils des installations délicieuses et configurables autocompletion et vous n'aurez pas à taper de beaucoup (apprendre à utiliser le tab touche de votre clavier). En outre, les scripts et les programmes font souvent partie de commandes composites (pipelines, etc ...).

PS J'utilise Unix depuis 1986 et Linux depuis 1993. Je n'ai jamais lancé mes propres programmes ou scripts en cliquant sur. Pourquoi devrais-je?

15

Je sais que c'est assez vieux maintenant, mais je pense que cela ajoute à ce que la question demandait. 

Si vous êtes sur un Mac et que vous voulez pouvoir exécuter un script en double-cliquant dessus, vous devez utiliser l'extension .command. Également identique à avant, rendre le fichier exécutable avec chmod -x

Comme il a été noté précédemment, ce n’est pas vraiment utile.

2
w_jay

juste .sh.

Exécutez le script comme ceci:

./script.sh

EDIT: Comme l'a dit Anubhava, l'extension n'a pas d'importance. Mais pour des raisons d'organisation, il est toujours recommandé d'utiliser des extensions.

2
Marc Anton Dahmen

TL; DR - Si l'utilisateur (pas nécessairement le développeur) du script utilise une interface graphique, cela dépend du navigateur de fichiers utilisé. Le Finder de MacOS nécessitera l'extension .sh pour exécuter le script. Gnome Nautilus, cependant, reconnaît les scripts correctement connectés avec ou sans l'extension .sh.

Je sais que les raisons pour et contre l'utilisation d'une extension sur des scripts bash ont déjà été répétées à maintes reprises, mais pas autant pourquoi ou pourquoi ne pas utiliser des extensions, mais j'ai ce que je considère être une bonne règle de base.

Si vous êtes du type qui sautille bash et utilise le terminal en général ou si vous développez un outil pour quelqu'un d'autre qui n'utilise pas le terminal, insérez une extension .sh dans vos scripts bash. De cette manière, les utilisateurs de ce script ont la possibilité de double-cliquer sur ce fichier dans un navigateur de fichiers à interface graphique pour exécuter le script.

Si vous êtes du genre à faire tout ou partie de votre travail dans le terminal, ne vous embêtez pas d'ajouter une extension à vos scripts bash. Ils ne serviraient à rien dans le terminal, en supposant que vous ayez déjà configuré votre fichier ~/.bashrc pour différencier visuellement les scripts des répertoires.

Modifier:

Dans le navigateur de fichiers Gnome Nautilus avec 4 fichiers de test (chacun avec les autorisations données pour le fichier à exécuter) avec la commande bêtement simple bash pour ouvrir une fenêtre de terminal (gnome-terminal):

  1. Un fichier sans extension avec #!/bin/bash sur la première ligne.

    Cela a fonctionné en double-cliquant sur le fichier.

  2. Un fichier avec une extension .sh avec #!/bin/bash sur la première ligne.

    Cela a fonctionné en double-cliquant sur le fichier.

  3. Un fichier sans extension avec NO #!/bin/bash sur la première ligne.

    Cela fonctionnait en double-cliquant sur le fichier ... techniquement, mais l'interface graphique n'indiquait pas qu'il s'agissait d'un script Shell. Il a dit que c'était juste un fichier texte brut.

  4. Un fichier avec une extension .sh avec NO #!/bin/bash sur la première ligne.

    Cela a fonctionné en double-cliquant sur le fichier.

Cependant, comme Keith Thompson, dans les commentaires de cette réponse, l'a fait remarquer avec sagesse, en utilisant l'extension .sh au lieu de bash Shebang sur la première ligne du fichier (#!/bin/bash), cela pourrait poser des problèmes.

Un autre cependant, je me souviens que j’utilisais précédemment MacOS, que même les scripts bash correctement tramés (est-ce un mot?) Sans extension .sh ne pouvaient pas être exécutés à partir de l’interface graphique sous MacOS. J'aimerais bien que quelqu'un me corrige à ce sujet dans les commentaires. Si cela est vrai, cela prouverait qu'il existe au moins un navigateur de fichiers dans lequel l'extension .sh est importante.

0
Ryan Hart