Pourquoi certains systèmes exécuteront-ils un .sh
fichier simplement en spécifiant le nom du fichier sans extension et d'autres nécessitent un nom plus une extension? Dans mon cas, j'essaie d'écrire une série de commandes en suivant ces instructions .
Je spécifie l'extension maintenant mais pouvoir exécuter les commandes sans .sh
serait préférable.
command-line
scripts
Philip Kirkbride
la source
la source
.sh
en tant qu'extension est dans de nombreuses circonstances considérée comme une mauvaise pratique: elle est contraire à la façon dont les autres commandes sont nommées (vous ne les exécutez pasls.elf
), elle est souvent trompeuse (si vousfoo.sh
commencez par#!/bin/bash
, alors l'exécutionsh foo.sh
s'exécutera avec un interpréteur différent de celui pour lequel elle est conçue) ), et si vous réécrivezfoo.sh
pour être un programme Python, l'utilisation de cette extension signifie que vous devez choisir entre conserver le nom désormais trompeur et réécrire chaque programme qui l'appelle.+x
jeu - oùfoo.sh
est une bibliothèque qui peut être affiché dans une POSIX,foo.bash
peut être affiché dans bash,foo.ksh
en ksh, etc.Réponses:
Tu es confus. L'
.sh
extension n'est qu'un indice pour les humains et n'a absolument aucun effet sur la façon dont le système gère le fichier. Unix / Linux n'a pas fait l'Secrets.pdf.exe
erreur de Windows .Voici ce qui se passe lorsque vous tapez
foo
:Redirection pour
STDIN
,STDOUT
etSTDERR
sont mis en place.Le shell vérifie sa table de hachage interne pour voir s'il connaît déjà une
$PATH
entrée pourfoo
. S'il n'en existe pas, le shell recherche dans les répertoires$PATH
, à la recherche d'un fichier appeléfoo
dont le bit d'exécution est défini dans ses autorisations de fichier. Premièrefoo
victoire.Si les deux premiers octets du fichier le
foo
sont#!
, la chaîne suivante est le nom d'un interpréteur à exécuter.#!/bin/bash
Introduit ainsi un script Bash,#!/usr/bin/perl
introduit un script Perl, etc.Si le fichier commence par
\177ELF
, c'est un exécutable binaire et leld.so
démarre.Lisez
man execve
etman ld.so
pour une explication plus détaillée.la source
chmod +x
) résout à peu près cela, non?x
bit de manière optimiste sur tout) et d'où le fichier provient (tout processus contrôlant le répertoire peut être amené à définir les autorisations) . Donc, cela l' atténue , mais je ne dirais pas qu'il le résout .Secrets.pdf.exe
parce que je désactive toujours lahide file extension
fonction stupideLe point clé est le suivant: les extensions ne sont pas pertinentes dans tout système système de type Unix. Un nom de fichier est juste un nom et n'a aucun effet sur l'exécution ou non d'un script ou d'un exécutable compilé . Un programmeur peut ajouter une
.sh
extension pour désigner qu'un fichier est un script shell, ou.py
pour un script python, mais contrairement à Windows, tout unix ne se soucie pas du nom, il se soucie des autorisations.Ce qui importe, c'est l'autorisation exécutable accordée à un fichier. Avec lequel vous pouvez vérifier
Exécuter des exécutables
Pour exécuter un script, il existe généralement plusieurs méthodes.
./my_script_name
. Le.
répertoire courant moyen./home/user/bin/my_script_name
(Les deux méthodes ci-dessus reposent sur un ensemble d'autorisations exécutables; que le fichier fasse partie de la
$PATH
variable ou non. La présence de la#!
ligne est également importante; sans elle, le script sera exécuté par le shell actuel que vous avez ouvert. Si j'ai uncsh
script sans cette ligne, et essayez de l'exécuter en bash avec./my_script.csh
, cela échouera)$PATH
variable, vous pouvez l'exécuter simplement en appelant le nom. Vous pouvez appeler lachmod
commande en ligne de commande en tapant simplement son nom car il se trouve dans le/bin
dossier./bin
fait toujours partie de la$PATH
variable. Dans ce cas, les autorisations exécutables et l'emplacement du sujet du script. filename.sh
ousource filename.sh
fera en sorte que le script soit traité comme s'il s'agissait d'une entrée au clavier, c'est-à-dire comme s'il était tapé directement en ligne de commande. Dans ce cas, les autorisations exécutables et l'emplacement n'ont pas d'importanceExemples
Exemple # 1, en cours d'exécution avec interprète, pour exécuter des autorisations
Exemple # 2, exécuté avec
./
un ensemble d'autorisations exécutables, un ensemble de lignes shebang.Exemple # 3, s'exécutant sans jeu de lignes shebang (échoue, car bash ne peut pas lire les scripts python; aucune ligne shebang n'assume le shell actuel comme interpréteur)
Exemple # 4, exécution d'un script doté d'autorisations exécutables, dossier de formulaire défini faisant partie de la
$PATH
variableL'exemple n ° 5, suppression d'une extension, s'exécute toujours car les extensions n'ont pas d'importance, mais il dispose d'autorisations et fait partie de
$PATH
:la source
PATH
?man chmod
pour voir comment définir les autorisationsDe bonnes explications ici déjà. Je voulais juste ajouter que, idéalement, vous ne devriez pas utiliser d'extensions de fichiers pour les exécutables.
Habituellement, vous devez accomplir quelque chose de relativement facile et vous commencez avec un petit script shell. Au fil du temps, vous commencez à ajouter de plus en plus de fonctionnalités à votre script, jusqu'à ce qu'il arrive un certain temps qu'il devienne impossible à maintenir ou que vous ayez besoin de fonctionnalités que vous ne pouvez pas accomplir facilement avec un script shell et pensez à réécrire ce script shell dans une autre langue (python , perl, ...?).
La réécriture à partir de zéro est généralement considérée comme une erreur, mais pour les scripts, cela peut être logique car généralement ils ne sont pas si grands ou ont beaucoup de fonctionnalités. Mais supposons qu'il est possible de réécrire à partir de zéro dans un autre langage, en conservant la fonctionnalité et les paramètres / drapeaux du script shell initial.
Les utilisateurs de ce script n'ont pas besoin d'être au courant de ce changement de langue, ils continueront à exécuter la même commande et elle continuera de fonctionner.
Si votre script a été nommé
do-something.sh
, il peut continuer à l'êtredo-something.sh
, mais maintenant il est écrit en python (par exemple), et donc votre indice initial est maintenant totalement trompeur.la source
Pour exécuter des fichiers sans extension, vous n'avez normalement pas besoin de faire grand-chose, assurez-vous simplement que vous avez (dans le cas des scripts bash) la ligne de shebang appropriée à la toute première ligne:
alors vous devez également rendre le fichier exécutable pour le système par
C'est la même chose que l'utilisation
chmod +x yourfilename
des chiffres est facile à expliquer.Il s'agit d'un nombre triple d'octales ajoutées, le premier nombre correspond à l'utilisateur, le second au groupe et le troisième aux autres, plus d'informations que vous pouvez trouver ici .
Et si vous êtes dans le même répertoire que votre script, n'oubliez pas d'utiliser
./
comme ceci:la source
Le suffixe .sh peut en fait gêner, car pour l'exécuter, vous devez taper myscript.sh au lieu de simplement myscript qui ne fonctionnera pas. Mieux vaut simplement l'appeler "myscript" sans le suffixe .sh, et une utilisation rapide de la commande "file" vous dira s'il s'agit d'un exécutable binaire (format ELF sur linux) ou d'un script shell, ou de tout autre type de script.
QDOS (système d'exploitation rapide et sale, renommé plus tard en "DOS" par IBM après que Mirosoft l'ait piraté et vendu illégalement à eux) et d'autres arnaques bon marché de CP / M, y compris Windows, mélangent tout cela parce que sur ces systèmes, il n'y a pas telle que l'exécution des autorisations sur les fichiers. Cela s'est traduit par d'innombrables problèmes de sécurité au cours des 30 à 40 dernières années. En fait, il y a quelques minutes, je viens de recevoir plusieurs courriers indésirables avec un fichier zip piégé renard renommé MYPICTURE.JPG.zip :)
la source