J'utilise actuellement ceci pour afficher l'heure actuelle dans mon invite bash:
PS1=\[\e[0;32m\]\t \W>\[\e[1;37m\]
20:42:23 ~>
Est-il possible d'afficher le temps écoulé depuis l'invite précédente? Tel que:
00:00:00 ~> sleep 10
00:00:10 ~> sleep 20
00:00:20 ~>
Cela n'a rien de commun avec Est-il possible de changer périodiquement la PS1 par un script en arrière-plan?
Réponses:
Une façon de le faire serait d'utiliser la fonctionnalité PROMPT_COMMAND de bash pour exécuter du code qui modifie PS1. La fonction ci-dessous est une version mise à jour de ma soumission d'origine; celui-ci utilise deux variables d'environnement en moins et les préfixe avec "_PS1_" pour essayer d'éviter d'encombrer les variables existantes.
Mettez-le dans votre .bash_profile pour démarrer.
Notez que vous devez taper assez rapidement pour que le
sleep
paramètre corresponde au paramètre d'invite - le temps est vraiment la différence entre les invites, y compris le temps qu'il vous faut pour taper la commande.Ajout tardif:
Basé sur la réponse maintenant supprimée de @Cyrus, voici une version qui n'encombre pas l'environnement avec des variables supplémentaires:
Ajout tardif supplémentaire:
À partir de la version bash 4.2 (
echo $BASH_VERSION
), vous pouvez éviter lesdate
appels externes avec une nouvelle chaîne de format printf; remplacer les$(date +%s)
pièces par$(printf '%(%s)T' -1)
. À partir de la version 4.3 , vous pouvez omettre le-1
paramètre pour vous fier au comportement "aucun argument ne signifie maintenant ".la source
$SECONDS
il cesse de suivre le temps écoulé depuis le démarrage du shell,$SECONDS
pour chaque invite est susceptible de provoquer des comportements inattendus. toute autre fonction shell qui pourrait l'utiliser pour une raison quelconque associée à l'évaluation de l'exécution se comportera mal.Cela gère la mise en forme par calcul - donc, bien qu'il se développe plusieurs fois, il ne fait aucun sous-shell ou tuyau.
Il traite simplement
$PS1
comme un tableau et utilise les indices supérieurs pour stocker / calculer tout / tous les états nécessaires entre les invites. Aucun autre état shell n'est affecté.Je peux le décomposer un peu peut-être ...
Tout d'abord, enregistrez la valeur actuelle de
$SECONDS
:Ensuite, définissez
$PS1[0]
comme auto-récursif d'une manière qui définira toujours les bonnes valeurs$PS1[1-3]
tout en se référençant simultanément. Pour obtenir cette partie, vous devez considérer l'ordre dans lequel les expressions shell-math sont évaluées. Plus important encore, le shell-math est toujours le dernier ordre du jour pour le shell-math. Avant tout, le shell développe les valeurs. De cette façon, vous pouvez référencer une ancienne valeur pour une variable shell dans une expression mathématique après l'avoir affectée à l'aide de$
.Voici d'abord un exemple simple:
Le shell évaluera cette déclaration en substituant d'abord la valeur de l'
$x
endroit où la$
référence du signe dollar est utilisée, et ainsi l'expression devient:... puis le shell ajoute 5 à la valeur de
$x
et étend ensuite l'expression entière àx+10+x
, tout en ne conservant que la valeur réellement affectée dans la variable de référence. Et donc la valeur développée de l'expression mathématique est 40, mais la valeur ultime de$x
est 15.C'est en grande partie ainsi que fonctionne l'
$PS1
équation, sauf qu'il existe un autre niveau d'expansion / évaluation mathématique exploité dans les indices de tableau.Je ne sais pas vraiment pourquoi j'ai choisi de l'utiliser
PS1[1]=!1
ici - je suppose que c'était probablement juste une esthétique stupide - mais cela attribue 0 à$PS1[1]
tout en le développant pour la substitution de paramètres. La valeur d'un AND au niveau du bit pour 0 et toute autre chose sera toujours 0, mais elle ne court-circuite pas comme le fait un booléen&&
lorsque le primaire le plus à gauche est 0 et donc l'expression entre parenthèses est toujours évaluée à chaque fois. C'est important, bien sûr, parce que cette première élipse est l'endroit où les valeurs initiales de$PS1[2,3]
sont définies.Quoi qu'il en soit,
$PS1[1]
est ici assuré d'être égal à 0 même s'il est falsifié avec / entre les tirages d'invite. Entre parenthèses, il ......
$PS1[2]
se voit attribuer la différence de$PS1[3]
et$SECONDS
, et$PS1[3]
le quotient de cette valeur et 3600. Toutes les valeurs sont ici initialisées. Et donc:... s'il y a au moins deux chiffres,
$PS1[3]
alors l'expansion interne est nulle, et parce que nous savons que$PS1[1]
0, alors si elle$PS1[3]
peut être remplacée par rien, il en est de même$PS1[1]
autrement elle est développée à sa valeur. De cette façon, seules les valeurs à un chiffre pour chaque itération d'$PS1[3]
affectations développeront un zéro de tête, et$PS1[3]
elle-même est étendue modulo 60 immédiatement après tout en étant simultanément affectée à la prochaine valeur successivement plus petite pour chacune des heures, minutes et secondes.Rincez et répétez, jusqu'à ce que la dernière itération
$PS1[3]
soit écrasée avec la valeur actuelle de$SECONDS
afin qu'elle puisse être comparée$SECONDS
une fois de plus lorsque l'invite est ensuite dessinée.la source
La meilleure solution que j'ai trouvée jusqu'à présent est la suivante: https://github.com/jichu4n/bash-command-timer
Qui imprime
[ 1s011 | May 25 15:33:44 BST ]
alias le temps écoulé sur le côté droit après la commande exécutée, de sorte qu'il ne vous encombre pas PS1.L'ensemble du format de chaîne et d'heure est configurable. Même la couleur et la précision sont configurables. Je sais que cela pourrait être un peu trop pour certains minimalistes, mais c'est plutôt cool.
la source