2009-05-27 17 views
1

script(1) est un outil pour conserver un enregistrement d'une session de terminal interactive; par défaut, il écrit dans le fichier transcript. Mon problème est que j'utilise ksh93, qui a des fonctions readline, et donc la transcription est mucked up avec toutes sortes de séquences d'échappement terminales et il peut être très difficile de reconstruire la commande qui a été réellement exécutée. Sans oublier les ^M errants et autres.Existe-t-il un outil pour nettoyer la sortie de l'outil script (1)?

Je cherche un outil qui va lire un fichier de transcription écrit par script, supprimer tous les déchets, et reconstruire ce que le shell pensait qu'il était en cours d'exécution, donc j'ai quelque chose qui montre $PS1 et les commandes effectivement exécutées. À défaut, je cherche des suggestions sur la façon d'écrire un tel outil, idéalement en utilisant les connaissances de la base de données terminfo, ou à défaut, en utilisant simplement les séquences d'échappement ANSI.

Une triche qui semble dans l'histoire de la coquille, aussi longtemps que cela fonctionne vraiment, serait également acceptable.

Répondre

0

Est-ce que cat/more ne fonctionne pas par défaut pour parcourir la transcription? Avez-vous l'intention de créer un script à partir des commandes réellement exécutées (ce qui dans mon expérience peut être dangereux)?

Quoi qu'il en soit, 3 ans sans réponse, donc je vais tenter le coup avec une solution incomplète. Si vous êtes uniquement intéressé par les commandes réellement tapées, supprimez les caractères non imprimables, puis remplacez PS1 'par quelque chose de lisible et unique, et grep pour cette chaîne unique. Comme ceci:

$ sed -i 's/[^[:print:]]//g' transcript 

$ sed 's/]0;[email protected]: [email protected]:~/CARTMAN/g' transcript | grep CARTMAN 

Explication: Après la première sed, PS1' peut être pris d'une des premières lignes du fichier de transcription, comme - PS1' est différent de PS1 - et peut être modifié avec une chaîne lisible unique ("CARTMAN" ici). Notez que le signe dollar à la fin de l'invite a été omis intentionnellement.

Dans les quelques exemples que j'ai essayés, cela n'a pas résolu tout mais a pris soin de la plupart des problèmes.