65 votes

Comment peut-on la dernière commande du mur le temps de mettre à l'invite Bash?

Est-il possible d'intégrer la dernière commande est écoulé mur du temps dans un Bash invite? Je suis en espérant quelque chose qui ressemblerait à ceci:

[last: 0s][/my/dir]$ sleep 10
[last: 10s][/my/dir]$

Arrière-plan

J'ai souvent parcourir de longues données croquant des emplois et il est utile de savoir combien de temps ils ont prises afin que je puisse estimer combien de temps il faudra pour les futurs travaux. Pour très régulièrement des tâches, je vais de l'avant et d'enregistrer cette information rigoureusement l'utilisation appropriée des techniques d'exploitation forestière. Pour moins formelle des tâches, je vais juste faire précéder la commande par l' time.

Il serait agréable de automatiquement time chaque commande interactive et avoir le temps de l'information imprimée en quelques caractères plutôt que 3 lignes.

109voto

Ville Laurikari Points 10484

Cela est minime autonome de code pour obtenir ce que vous voulez:

function timer_start {
  timer=${timer:-$SECONDS}
}

function timer_stop {
  timer_show=$(($SECONDS - $timer))
  unset timer
}

trap 'timer_start' DEBUG
PROMPT_COMMAND=timer_stop

PS1='[last: ${timer_show}s][\w]$ '

11voto

willdye Points 457

Un autre très minime approche est la suivante:

trap 'SECONDS=0' DEBUG
export PS1='your_normal_prompt_here ($SECONDS) # '

Cela affiche le nombre de secondes depuis la dernière commande simple a été lancé. Le compteur n'est pas réinitialisé si vous appuyez simplement sur Entrée sans entrer une commande, ce qui peut être pratique quand vous voulez juste pour voir combien de temps le terminal a été depuis que vous avez quelque chose en elle. Il fonctionne très bien pour moi dans Red Hat et Ubuntu. Cela n'a PAS fonctionné pour moi sous Cygwin, mais je ne suis pas sûr si c'est un bug ou juste une limitation de tenter de les exécuter Bash sous Windows.

Un possible inconvénient de cette approche est que vous gardez la réinitialisation de SECONDES, mais si vous avez vraiment besoin pour préserver quelques SECONDES, comme le nombre de secondes depuis les premières shell invocation, vous pouvez créer votre propre variable pour la PS1 comptoir au lieu d'utiliser des SECONDES directement. Un autre inconvénient possible est que la valeur des secondes comme "999999" est peut-être mieux être affichés comme des jours+heures+minutes+secondes, mais il est facile d'ajouter un filtre simple comme:

seconds2days() { # convert integer seconds to Ddays,HH:MM:SS
  printf "%ddays,%02d:%02d:%02d" $(((($1/60)/60)/24)) \
  $(((($1/60)/60)%24)) $((($1/60)%60)) $(($1%60)) |
  sed 's/^1days/1day/;s/^0days,\(00:\)*//;s/^0//' ; }
trap 'SECONDS=0' DEBUG
PS1='other_prompt_stuff_here ($(seconds2days $SECONDS)) # '

Cela se traduit par "999999" en "11days,13:46:39". Le sed à la fin de la "1days" à "1", et retire vide menant des valeurs telles que "0days,00:". Ajuster à votre goût.

10voto

miku Points 63392

Vous pourriez utiliser cette zsh-emprunté crochet pour bash: http://www.twistedmatrix.com/users/glyph/preexec.bash.txt

Le Timing fait avec ce crochet (Mac OS X): Utilisation de Grondement à surveiller de longue durée d'exécution des commandes shell

8voto

philsnow Points 21

Si vous n'avez pas défini à l'une des autres réponses avant de vous coups de pied hors de votre de travail de longue durée et vous voulez juste savoir combien de temps le travail a pris, vous pouvez faire de la simple

$ HISTTIMEFORMAT="%s " history 2

et il répondra avec quelque chose comme

  654  1278611022 gvn up
  655  1278611714 HISTTIMEFORMAT="%s " history 2

et vous pouvez ensuite simplement visuellement la différence entre les deux dates (de quelqu'un sait comment faire pour capturer la sortie de la commande interne du shell de l'histoire de la commande?)

0voto

Andrew Stein Points 6344

Va mettre un \t PS1 travail pour vous?

Il ne donne pas le temps écoulé, mais il devrait être assez facile de soustraire la fois, si nécessaire.

$ export PS1='[\t] [\w]\$ '
[14:22:30] [/bin]$ sleep 10
[14:22:42] [/bin]$


La suite de l'OP commentaire qu'il est déjà à l'aide de \t. Si vous pouvez utiliser tcsh au lieu de bash, vous pouvez définir la variable de temps.

/bin 1 > set time = 0
/bin 2 > sleep 10
0.015u 0.046s 0:10.09 0.4%      0+0k 0+0io 2570pf+0w
/bin 3 >

Vous pouvez modifier le format de l'impression d'être moins moche (se la tcsh page de man).

/bin 4 > set time = ( 0 "last: %E" )
/bin 5 > sleep 10
last: 0:10.09
/bin 6 >

Je ne sais pas d'une installation similaire dans bash

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X