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

Ender Phan
la source
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"
Arkadiusz Drabczyk
la source
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.
heemayl
la source
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