web-dev-qa-db-fra.com

Bash: Comment obtenir l'historique des commandes dans une session d'écran?

Si je lance une session d'écran avec screen -dmS name, comment accéder à l'historique des commandes de cette session d'écran avec un script?

En utilisant le , la dernière commande exécutée apparaît, même à l’écran.

16
hexacyanide

screen ne conserve pas d'historique des commandes que vous tapez. Votre Shell peut ou non conserver une histoire. Puisque vous semblez utiliser bash, vous pouvez utiliser la commande history.

screen semble avoir une approximation grossière d’une recherche dans l’historique (il recherche simplement une ligne de commande dans le tampon de défilement. Voir la page de manuel screen sous la commande "history" (lié à C-a { par défaut).

7
chepner

J'utilise le shell bash par défaut sur mon système et il est donc possible que cela ne fonctionne pas avec d'autres shells.

voici ce que j'ai dans mon fichier ~/.screenrc pour que chaque nouvelle fenêtre d'écran reçoive son propre historique de commandes:

Fenêtres d'écran par défaut avec propre historique de commande

Pour ouvrir un ensemble de fenêtres d'écran par défaut, chacune avec son propre fichier d'historique de commandes, vous pouvez ajouter les éléments suivants au fichier ~/.screenrc:

screen -t "window 0" 0 bash -ic 'HISTFILE=~/.bash_history.${WINDOW} bash'
screen -t "window 1" 1 bash -ic 'HISTFILE=~/.bash_history.${WINDOW} bash'
screen -t "window 2" bash -ic 'HISTFILE=~/.bash_history.${WINDOW} bash'

S'assurer que les nouvelles fenêtres obtiennent leur propre historique de commande

Les paramètres d'écran par défaut signifient que vous créez une nouvelle fenêtre à l'aide de Ctrl+a c ou Ctrl+a Ctrl+c. Cependant, avec seulement ce qui précède dans votre fichier ~/.screenrc, ceux-ci utiliseront le fichier par défaut ~/.bash_history. Pour résoudre ce problème, nous allons écraser les raccourcis clavier pour la création de nouvelles fenêtres. Ajoutez ceci à votre fichier ~/.screenrc:

bind c screen bash -ic 'HISTFILE=~/.bash_history.${WINDOW} bash'
bind ^C screen bash -ic 'HISTFILE=~/.bash_history.${WINDOW} bash'

Désormais, chaque fois que vous créez une nouvelle fenêtre d’écran, vous lancez un shell bash et définissez la variable d’environnement HISTFILE sur quelque chose qui inclut le numéro de la fenêtre d’écran actuelle ($WINDOW).

Les fichiers d’historique des commandes seront partagés entre les sessions d’écran portant le même numéro de fenêtre.

Écrire des commandes sur $HISTFILE lors de l'exécution

Comme c'est le cas avec le comportement bash habituel, l'historique est uniquement écrit dans le fichier $HISTFILE lorsque vous quittez la fenêtre Shell/screen. Toutefois, si vous souhaitez que les commandes soient écrites dans les fichiers d'historique après leur exécution, et donc immédiatement disponibles pour les autres sessions d'écran ayant le même numéro de fenêtre, vous pouvez ajouter un élément similaire à votre fichier ~/.bashrc:

export Prompt_COMMAND="history -a; history -c; history -r; ${Prompt_COMMAND}"
23

Lorsque vous exit un terminal (ou un shell), le shell écrit son historique dans $ HISTFILE. Ainsi, pour obtenir son historique dans un autre terminal, vous pouvez taper exit dans le terminal dont vous souhaitez consulter l'historique.

cat $HISTFILE
#or tac, less, $EDITOR, ... depending on how you want to "access" it
2
technosaurus

utilisez ceci: screen -L avec L majuscule il stockera une copie des entrées et sorties du terminal dans un fichier nommé screenlog.0 ou si vous utilisez -S pour le nommer, le fichier journal obtient le nom d'écran 

1
mehrdad

Je mets les prochaines lignes dans mon .bashrc:

case "$TERM" in
   screen)
       declare SCREEN_NAME=$(echo $STY | sed -nr 's/[^.]*\.(.*)/\1/p')
       if [[ $SCREEN_NAME ]]; then
           HISTFILE="${HISTFILE}.${SCREEN_NAME}.${WINDOW}"
           declare -p HISTFILE
       fi
       unset SCREEN_NAME
       ;;
   *)
       ;;
esac

Mon .bashrc par défaut a cette "casse" essentiellement avec la valeur "xterm * | rxvt *)", donc je n'y ai ajouté que ma partie "screen". Si vous n'avez pas ce 'cas', vous pouvez utiliser le suivant à la place:

if [[ $TERM == screen ]]; then
   declare SCREEN_NAME=$(echo $STY | sed -nr 's/[^.]*\.(.*)/\1/p')
   if [[ $SCREEN_NAME ]]; then
       HISTFILE="${HISTFILE}.${SCREEN_NAME}.${WINDOW}"
       declare -p HISTFILE
   fi
   unset SCREEN_NAME
fi

Et après j'ai un own bash_history pour toutes les fenêtres de mon tout écran .

Remarque: cela ne fonctionne pas dans chroot!

1
Regisz

@technosaurus a raison. $ HISTFILE est écrit lors de la fermeture de bash. Vous pouvez donc quitter une session bash et en démarrer une nouvelle et l'historique doit avoir été préservé dans le fichier.

Mais je pense qu’il existe un meilleur moyen de résoudre votre problème. Le manuel bash inclut une description de la commande intégrée history . Il vous permet de sauvegarder cet historique avec history -w [filename] et de le lire avec history -r [filename]. Si vous ne fournissez pas un nom de fichier, il utilisera $ HISTFILE.

Je vous propose donc de sauvegarder l'historique de votre session d'écran dans un fichier spécifique (ou dans votre $ HISTFILE par défaut si vous le souhaitez). Lisez ensuite le fichier d’historique de l’autre session bash à partir de laquelle vous souhaitez accéder à l’historique. De cette façon, vous n'avez pas à quitter la session bash d'origine.

1
RaveTheTadpole

history affichera toute la commande history.

0
Yap Kai Lun Leon