Exécutez le script bash chaque fois que les lignes de commande sont exécutées


9

Je suis un nouvel utilisateur Ubuntu / Linux, je voudrais poser une question comme mon titre ci-dessus.

Par exemple, j'ai un fichier bash ./script, je voudrais le faire fonctionner automatiquement lorsque je tape une ligne de commande. Une fois que j'exécute la ligne de commande, pwdle ./scriptsera exécuté. Une fois que je tape la ligne de commande suivante, ls -lale ./scriptsera à nouveau exécuté.


4
pouvons-nous demander: quel type d'action vous avez l'intention de faire sur chaque commande tapée? et ne devrait-il être que pour ceux tapés de manière interactive? ou aussi pour n'importe quelle commande dans un script? et qu'en est-il des commandes tapées sur ssh? etc. Cela pourrait être un XYProblem
Olivier Dulac

Réponses:


13

Vous devez définir une PROMPT_COMMANDvariable. De man bash:

PROMPT_COMMAND
              If set, the value is executed as a command prior to
              issuing each primary prompt.

Par exemple, cela écrira la date actuelle à /tmp/PCchaque fois qu'une commande est exécutée:

 $ PROMPT_COMMAND="date > /tmp/PC"

1
Oui, je l'ai .. solution assez cool. (a voté)
Ender Phan

1
C'est faux. La commande echo $(date)sera exécutée au moment de la déclaration, elle sera donc toujours affichée (enregistrée) en même temps.
heemayl

@heemayl: bien sûr, vous avez raison, je l'ai corrigé
Arkadiusz Drabczyk

@ lộcphan Si l'une de ces réponses a résolu votre problème, veuillez prendre un moment et l' accepter en cliquant sur la coche à gauche. Cela marquera la réponse à la question et c'est la façon dont les remerciements sont exprimés sur les sites Stack Exchange.
terdon

@heemayl: Pourquoi? ...
Arkadiusz Drabczyk

11

Vous recherchez PROMPT_COMMANDune variable d'environnement, la valeur de cette variable sera exécutée en tant que commande, après l'exécution de chaque commande donnée dans le terminal, juste avant d'afficher l'invite suivante.

Par exemple, définissez-le comme:

export PROMPT_COMMAND='/path/to/script'

Faites d'abord le script /path/to/script, exécutable.

Maintenant, le script sera exécuté après chaque commande.

Juste pour noter, si vous ne voulez pas que la variable soit exportée, c'est-à-dire en faire une variable shell au lieu d'une variable d'environnement, supprimez export:

PROMPT_COMMAND='/path/to/script'

De man bash:

PROMPT_COMMAND 
If set, the value is executed as a command prior to issuing each primary prompt.

Je l'ai, merci beaucoup pour votre aide :) (en passant par les votes positifs)
Ender Phan

Pourquoi utilisez-vous export?
Arkadiusz Drabczyk du

@ArkadiuszDrabczyk exportfera de la variable PROMPT_COMMANDune variable d'environnement, c'est-à-dire que la variable sera disponible pour tous les processus enfants (par exemple les sous-coquilles) du shell actuel. Si vous souhaitez simplement le confiner uniquement dans la session shell actuelle (variable shell), supprimez export.
heemayl

5
@heemayl: IMO exportn'est pas une bonne pratique ici - PROMPT_COMMANDne doit être défini que dans un fichier de démarrage du shell interactif et ne doit pas être visible dans l'environnement
Arkadiusz Drabczyk
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.