Exécuter le script dans le shell actuel sans. avant la commande

26

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?

alu
la source

Réponses:

22

Ce n'est peut-être pas exactement ce que vous voulez, mais vous pouvez le faire:

alias somescript.sh='. ./somescript.sh'
Scott
la source
2
Cela a parfaitement résolu mon problème. Merci!
alu
8

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 un bashsous - shell). Par conséquent, les modifications apportées somescript.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 .- sourceclé ou .

Martin von Wittich
la source
Merci pour l'explication détaillée. :) Maintenant, je vois qu'il n'y a aucun moyen de faire cela à partir du script appelé, mais heureusement, le shell parent peut être dit de ne pas créer de sous-shell avec la aliascommande, comme suggéré par scott.
alu
1

Si vous exécutez en ./somescript.shtant 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.

Gilles 'SO- arrête d'être méchant'
la source
0

Je pense que le script que vous essayez d'exécuter n'est pas exécutable. chmod a+x somescript.shajoutera 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.shvous 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.

AR Diederich
la source
Les scripts eux-mêmes fonctionnent bien, mais je veux l'exécuter dans le shell actuel pour pouvoir modifier les variables d'environnement du shell.
alu
Si l'exportation de la variable que vous souhaitez dans le script ne fonctionne pas, comme export PATH=$PATH:/usr/local/binpour 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.shs'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.
AR Diederich
La modification d'une variable n'était qu'un exemple. Ma question est de savoir s'il est possible de dire au shell qu'il devrait y avoir un point sans l'écrire réellement (par exemple à partir du script lui-même)
alu
Le point peut être facilement oublié, ce qui peut changer complètement le comportement du script.
alu
0
export PATH=$PATH:.

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 ./

GabeDain
la source
1
L'OP pose des questions sur le premier et .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 . ./somescriptfait.
Anthon