Si un script doit être exécuté dans le shell courant, cela peut être réalisé en ajoutant un point avant la commande:
. ./somescript.sh
Existe-t-il un moyen de le faire sans taper le point à chaque fois? Par exemple, une commande pour passer au shell parent à partir du script lui-même?
Je ne pense pas qu'il y en ait (à part taper
source somescript.sh
, mais ce n'est probablement pas ce que vous cherchez ^^).Si vous exécutez le script comme d'habitude avec
./somescript.sh
, le shell forche et exécute cette commande. Il passe la commande au noyau, puis le noyau décide comment cette commande doit être exécutée en analysant la#!
ligne à l'intérieur du script. Le noyau lance alors l'interpréteur spécifié (dans ce cas probablement unbash
sous - shell). Par conséquent, les modifications apportéessomescript.sh
à son environnement sont isolées dans le sous-shell sans affecter le shell parent.Si vous voulez que le shell lise le script lui-même sans lancer un autre processus, vous devez le dire explicitement en utilisant le mot
.
-source
clé ou .la source
alias
commande, comme suggéré par scott.Si vous exécutez en
./somescript.sh
tant que programme externe, il ne peut rien faire dans le processus shell en cours d'exécution, comme accéder à des variables non exportées, définir des variables, changer le répertoire courant, etc. Il n'y a aucun moyen de contourner cela.(Eh bien, ok, vous pourrez peut-être exécuter un débogueur à partir du sous-processus et modifier la mémoire du processus parent. Mais si vous l'essayez, le résultat le plus probable est de planter le shell parent.)
Vous devez courir
. ./somescript.sh
. Vous pouvez masquer cela derrière un alias ou une fonction si vous le souhaitez, mais encore une fois, la définition de l'alias ou de la fonction doit être effectuée dans le shell parent.la source
Je pense que le script que vous essayez d'exécuter n'est pas exécutable.
chmod a+x somescript.sh
ajoutera le bit d'exécution pour l'utilisateur, le groupe et autres (ugo) à ce fichier. La première ligne du fichier aura également besoin du #! ligne en haut, comme#!/bin/bash
.ls -l somescript.sh
vous montrera les triplets rwx (lecture / écriture / exécution) pour le fichier. Il faudra au moins un x dans le premier ensemble, en supposant que vous possédez le fichier.la source
export PATH=$PATH:/usr/local/bin
pour ajouter / usr / local / bin à votre $ PATH, vous devez alors source le fichier pour modifier vos variables d'environnement en cours d'exécution. Cette question est vraiment "Comment puis-je modifier par programme mes variables d'environnement dans mon shell en cours d'exécution à partir d'un script bash?" Le script. ./somescript.sh
s'exécute très bien - vous utilisez la commande dot pour créer une source dans un fichier. tcsh utilise "source" pour la même chose.L'exécution de cette commande dans le shell ou l'ajout à votre fichier de configuration du shell ajoutera le répertoire actuel à la variable PATH. La variable PATH est une liste de répertoires où votre shell recherchera les binaires à exécuter lorsque vous exécuterez une commande.
Cela vous permettra d'exécuter n'importe quel exécutable dans le répertoire courant sans
./
la source
.
non sur celui./
qui fait partie du nom de fichier. L'exécution de ./somescript ne l'exécute pas dans le shell actuel comme le. ./somescript
fait.