J'utilise un simple alias pour permettre le "tracking" des commandes dans une ou plusieurs fenêtre (s) de terminal:
alias trackmi='export PROMPT_COMMAND="history -a; $PROMPT_COMMAND"'
Ensuite, je viens de tail -f
mon fichier .bash_history dans un autre terminal sur l'espace de travail pour obtenir un retour immédiat. Je viens d'activer un historique illimité et de mettre à jour mon format d'historique ( export HISTTIMEFORMAT="[%F %T] "
) en .bashrc . Bien sûr, la history
commande affiche les horodatages. Mais le format du fichier historique en soi est:
#1401234303
alias
#1401234486
cat ../.bashrc
Comment puis-je convertir le temps Unix et afficher l'intégralité de la commande sur une seule ligne, comme avec la history
commande, y compris la numérotation:
578 [2014-05-27 19:45:03] alias
579 [2014-05-27 19:48:06] cat ../.bashrc
... et suivez ça. Ou trouver un moyen de sortir en continu la sortie de la history
commande vers le terminal?
la source
fn+1
pour comparer! Merci!Voici le produit final en action sur un xterm à écran partagé, des fonctions par défaut du shell à l'utilisation de quelques commandes:
Une façon plus grossière de le faire que celle illustrée dans la capture d'écran pourrait ressembler à ceci:
Où
${TGT_PTY}
serait tout ce que vous retirez de latty
commande lorsque vous exécutez réellement un shell interactif sur l'écran où vous voulez votre sortie. Ou, vraiment, vous pouvez utiliser n'importe quel fichier inscriptible car il s'agit essentiellement d'une cible pour la redirection de fichiers.J'utilise la syntaxe pty pour le pseudo-terminal parce que je suppose que c'est un xterm d'une certaine sorte, mais vous pourriez tout aussi facilement dédier un vt - et votre historique en streaming n'est toujours qu'à une
CTRL-ALT-Fn
combinaison de touches. Si c'était moi je pourrais combiner les deux notions et en faire unescreen
outmux
session sur un vt dédié ... Mais je m'égare.Sur une machine fraîchement démarrée, je suis accueilli par l'
/bin/login
invite typique d'unegetty
console Linux typique . J'appuieCTRL-ALT-F2
pour accéder à unekmscon
console moins typique qui se comporte beaucoup plus comme unxterm
que comme untty
. J'entre la commandetty
et reçois en réponse/dev/pts/0
.En général, xterms multiplexe un seul terminal en plusieurs en utilisant des pseudo-terminaux - donc si vous deviez faire une chose similaire dans X11 en basculant entre les onglets de terminal ou les fenêtres, vous recevriez probablement une sortie
/dev/pts/[0-9]*
également. Mais les consoles de terminaux virtuels accessibles avecCTRL-ALT-Fn
des combinaisons de touches sont de véritables (terminaux) terminaux et reçoivent donc leur propre/dev/tty[0-9]*
désignation.C'est pourquoi après la connexion à la console 2 lorsque je tape
tty
à l'invite, la réponse est,/dev/pts/0
mais lorsque je fais de même sur la console 1, la sortie est/dev/tty1
. En tout cas, de retour sur la console 2 je fais alors:Il n'y a aucun effet perceptible. Je continue à taper quelques commandes supplémentaires, puis je passe à la console 1 en appuyant à
CTRL-ALT-F1
nouveau. Et là, je trouve des entrées répétées qui ressemblent à<date_time>\n<hist#>\t<hist_cmd_string>
chaque commande que j'ai tapée sur la console 2.À moins d'écrire directement sur un terminal, une autre option pourrait ressembler à ceci:
Et puis peut-être ...
La commande d'invite approximative ne correspond pas à vos spécifications - pas de chaîne de
date
formatage ni d'options de formatage pour lesfc
deux - mais son mécanisme ne nécessite pas beaucoup: chaque fois que votre invite rend la dernière commande d'historique et la date et l'heure actuelles sont écrites dans le${TGT_PTY}
fichier que vous spécifiez. C'est aussi simple que ça.L'observation et l'impression de l'historique de la coque est
fc
l'objectif principal de. C'est un shell intégré, même s'ildate
ne l'est pas. Danszsh
fc
peut fournir toutes sortes d'options de mise en forme fantaisie, dont plusieurs s'appliquent aux horodatages. Et bien sûr, comme vous le constatez ci - dessus,bash
esthistory
peut faire la même chose.Dans l'intérêt d'une sortie plus propre, vous pouvez utiliser une technique que j'ai mieux expliquée ici pour définir une variable de suivi persistante dans le shell actuel , même si vous devez la suivre et la traiter en sous-coquilles dans la séquence d'invite.
Voici un moyen portable de formatage selon vos spécifications:
Je Mettre en oeuvre le last_history contre
$_LH
que les pistes seulement les dernières mises à jour afin que vous n'écrivez pas la même commande l' histoire deux fois - par exemple juste pour entrer en appuyant sur. Il y a un peu de dispute nécessaire pour obtenir la variable incrémentée dans le shell actuel afin qu'elle conserve sa valeur même si la fonction est appelée dans un sous-shell - ce qui est, encore une fois, mieux expliqué dans le lien .Sa sortie ressemble à
<hist#>\t[%F %T]\t<hist_cmd>\n
Mais ce n'est que la version entièrement portable. Avec
bash
cela, vous pouvez le faire avec moins et en implémentant uniquement des commandes internes de shell - ce qui est probablement souhaitable lorsque vous considérez que c'est une commande qui s'exécutera à chaque fois que vous appuyez sur[ENTER]
. Voici deux façons:Alternativement, en utilisant
bash
lahistory
commande de, vous pouvez définir la_HIST
fonction de cette façon:La sortie de l'une ou l'autre méthode ressemble également à ceci:
<hist#>\t[%F %T]\t<hist_cmd>\n
bien que lahistory
méthode comprenne des espaces de début. Néanmoins, je pense que leshistory
horodatages de la méthode seront plus précis car je ne pense pas qu'ils devraient attendre que la commande référencée se termine avant d'acquérir leur tampon.Vous pouvez éviter de suivre n'importe quel état dans les deux cas si seulement vous filtrez le flux avec
uniq
- comme vous le feriez avecmkfifo
comme je l'ai mentionné précédemment.Mais le faire dans l'invite comme ceci signifie qu'il est toujours mis à jour uniquement dès que cela est nécessaire par la simple action de mettre à jour l'invite. C'est simple.
Vous pouvez également faire quelque chose de similaire à ce que vous faites,
tail
mais plutôt définirla source
${TGT_PTY}
et tout? Si c'est le cas, cela expliquerait la «redirection ambiguë» car ce serait une variable vide. Vous avez besoin d'un fichier./dev/pts/[num]
selon toute vraisemblance -cat
j'étais paranoïaque. Cela fonctionne bien - même 12 heures plus tard.N'hésitez pas à jouer avec le formatage, mais cela fait (je crois) ce que vous demandez ... enregistrez quelque part dans votre CHEMIN, rendez exécutable et profitez:
Je suis sûr qu'il peut être optimisé, mais vous avez compris.
Brève explication: comme ~ / .bash_history ne garde pas la trace du décompte, nous déterminons d'abord le nombre d'entrées. Ensuite, un peu de magie awk pour obtenir la bonne mise en forme et garder une trace du nombre d'entrées.
la source
tail -f
10 lignes initialement qui ont déjà été incluses dans votrecount
. Il suppose la date GNU dans un environnement non-POSIX (POSIXLY_CORRECT non défini). Il exécute un shell et une commande date par horodatage.count
compte la moitié de la ligne.bash_history
, puis incrémente pour chaque ligne qui ne commence pas#
, de sorte que le nombre d'historique rapporté est probablement incorrect. L'utilisationcount=$(grep -c '^#' ...)
serait probablement meilleure, mais dans tous les cas, ces numéros d'historique risquent de ne pas être synchronisés, surtout si vous avez plus de 2 bash en cours d'exécution en même temps.history
commande exploite.