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.
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).
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:
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'
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.
$HISTFILE
lors de l'exécutionComme 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}"
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
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
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!
@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.
history
affichera toute la commande history.