12
votes

Comment exécuter un script dans la coque actuelle sur Linux?

Y a-t-il un moyen de marquer un script à exécuter dans la coque actuelle de Whitin? Je sais que je peux utiliser: xxx pré>

mais j'ai besoin d'un moyen d'inclure le type "point" à l'intérieur du script. P>

EDIT: Voici le cas. J'ai un script "myscript.sh" situé dans le répertoire A: p> xxx pré>

lorsque le script est exécuté en normalement: P>

. ./myscript.sh


2 commentaires

Le "point" est sténographique pour la commande "source". Si je vous comprends correctement, cela ne peut pas être fait. Le script lui-même ne peut pas décider s'il doit être appelé ou approché, le shell d'appel doit décider cela.


En savoir plus sur Bash Fonction -S, E.G. Lire tldp.org/ldp/abs/html


5 Réponses :


0
votes
  1. mettre #! / bin / sh comme première ligne du script
  2. Ajouter une autorisation d'exécution I.e. chmod + x /path/to/script.sh

    alors vous pouvez exécuter le script

    I.e. /path/to/script.sh

    ou si vous avez / chemin / à dans la variable d'environnement de la page Vous pouvez simplement exécuter script.sh


1 commentaires

Cela fait exactement le contraire: il s'exécute dans un nouveau processus Shell, dans ma compréhension



6
votes

Vous pouvez le faire si vous créez une fonction shell au lieu d'un script. Les fonctions sont exécutées dans la même coquille, pas un sous-groupe. Si vous définissez des fonctions dans votre .profile, ils seront disponibles pour la coquille de connexion.

J'ai trouvé quelques autres détails et explications ici: http://steve-parker.org/sh /fonctions.shtml


0 commentaires

1
votes

Essayez ceci: chemin source / à / shell / script.sh

Il exécutera le script shell dans la coque actuelle.


0 commentaires

20
votes

Il existe deux façons d'exécuter un script dans la coquille. En fonction de vos besoins, vous devrez faire l'une des opérations suivantes (ne faites pas les deux!).

  1. Lancez le script en tant que programme, où il possède son propre processus.
  2. Source Le script comme un tas de texte, où le texte est traité par la coque actuelle.

    Pour lancer le script en tant que programme:

    • ajoutez la ligne #! / bin / bash comme première ligne du script

      Ceci sera lu par le chargeur, qui dispose d'une logique spéciale qui interprète les deux premiers caractères #! comme "lancez le programme à venir et transmettez-le au contenu". Notez que cela ne fonctionne que correctement pour les programmes écrits pour recevoir le contenu

      Pour sourcler le script dans la coque actuelle:

      • Tapez la commande . script.sh ou script source.sh

        Remarque: . in Bash est équivalent à source dans Bash.

        Cela agit comme si vous avez saisi le contenu de "script.sh". Par exemple, si vous définissez une variable dans "script.sh", cette variable sera définie dans la coque actuelle. Vous devrez non révéler la variable pour le refuser de la coque actuelle.

        Ceci diffère fortement de la #! / bin / bash exemple, car définition d'une variable dans le nouveau Bash Subprocess n'a pas d'impact sur la coquille que vous avez lancé la sous-processus de .


6 commentaires

Cette réponse fournit une belle explication, une option de contournement consiste à rechercher la définition de la fonction selon ma réponse ci-dessous.


Bonne explication mais ne répond pas à la question. Comment op d'éviter d'avoir à utiliser le "point" lorsque vous appelez le script? La réponse est des fonctions, comme expliqué dans d'autres réponses.


@Bzazz Je ne pense pas que vous lisiez le post attentivement, la réponse est «Source» et elle est là-bas. Vous ne pouvez pas simplement appeler une fonction sans la définir, et votre définition sera dans un fichier et de lire ce fichier dans la coque actuelle, vous devrez le chercher. En le mettant dans une coque différente, bien vous pouvez utiliser le shebang pour le lire dans une coquille de sous-processus, mais pas la coque actuelle.


Op sait déjà sur l'opérateur de points. Qui est la même que la source. Ils demandent comment inclure cela «à l'intérieur du script». Afin qu'il ne soit pas nécessaire d'utiliser le point lorsque vous appelez le script.


@Bzazz Je ne vois aucune indication dans la question initiale qui soutient l'idée que l'OP sait que la source est la même que celle de DOT. Bien sûr, ils savent sur DOT, mais dans leur cas, ils souhaitent importer des fonctions, des variables et du code d'un fichier externe dans leur script de shell / bash actuel. Généralement, y compris d'autres fichiers peuvent être effectués de deux manières, dans un sous-vase et dans le même shell. Subshell peut être traité avec l'EXED / BASH normal / etc. Mais le même shell nécessite soit "". ou «source» et il n'y a pas vraiment d'autre moyen. Donc, j'ai offert une "source" et j'ai expliqué que c'était la même chose et pourquoi.


@Bzazz Je ne sais pas pourquoi vous êtes si concentré sur cet article. Mais si vous voulez plonger dans les détails, veuillez souligner l'endroit où j'ai été mis à pied avec une référence à une sorte de documentation. En outre, n'essayons pas de deviner l'esprit de l'Asker, car aucun de nous n'a l'esprit. Je suis assez heureux que j'avais probablement la réponse qu'ils voulaient, comme ils m'ont suscité. Cela dit, il n'y a que tant de techniques disponibles, en raison des limites de la langue bash



3
votes

Une chose que vous pouvez faire est d'ajouter la fonction à votre profil .bash. Ensuite, la fonction n'exécutera pas un script.

Je vais essayer maintenant ... xxx

fonctionne ...

Donc, une autre option consiste à créer un fichier avec la définition de fonction et source de ce fichier.


1 commentaires

J'avais déjà défini une fonction comme celle-ci mais lisez que .bash_profile ne devrait pas être trop encombré, j'ai donc déplacé ma fonction à un script et a rencontré le même problème que l'OP obtenu. Ma solution actuelle consiste maintenant à utiliser le 'Edwin Buck''s. Script_name solution mais définissez ceci comme alias sur le nom de script normal dans mon .bash_profile , comme une autre option de solution