Bash:如何在屏幕会话中获取命令历史记录?

时间:2013-02-16 20:02:42

标签: bash command-line gnu-screen

如果我使用screen -dmS name开始屏幕会话,我将如何使用脚本访问该屏幕会话的命令历史记录?

使用,即使在屏幕上也会显示上次执行的命令。

7 个答案:

答案 0 :(得分:23)

我在系统上使用默认的bash shell,因此可能无法与其他shell一起使用。

这就是我在~/.screenrc文件中的内容,以便每个新的屏幕窗口都有自己的命令历史记录:

具有自己的命令历史记录的默认屏幕窗

要打开一组默认屏幕窗口,每个窗口都有自己的命令历史记录文件,您可以将以下内容添加到~/.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'

确保新Windows获取自己的命令历史记录

默认屏幕设置表示您使用Ctrl+a cCtrl+a Ctrl+c创建新窗口。但是,只有~/.screenrc文件中的上述内容,这些文件将使用默认的~/.bash_history文件。要解决此问题,我们将覆盖用于创建新窗口的键绑定。将其添加到您的~/.screenrc文件中:

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

现在,无论何时创建新的屏幕窗口,它实际上都会启动一个bash shell,将HISTFILE环境变量设置为包含当前屏幕窗口编号($WINDOW)的内容。

命令历史文件将在具有相同窗口编号的屏幕会话之间共享。

在执行时将命令写入$HISTFILE

与正常的bash行为一样,历史记录仅在退出shell / screen窗口时写入$HISTFILE文件。但是,如果您希望在执行命令后将命令写入历史文件,并因此可以立即将其用于具有相同窗口编号的其他屏幕会话,则可以向~/.bashrc文件中添加以下内容:

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

答案 1 :(得分:7)

screen不会保留您键入的命令的历史记录。你的shell可能会也可能不会保留历史记录。由于您似乎使用bash,因此可以使用history命令。

screen似乎有一个粗略的历史搜索近似值(它只是在回滚缓冲区中搜索命令行。请参阅“history”命令下的screen手册页(绑定到{默认情况下为{1}}。

答案 2 :(得分:2)

当您exit终端(或shell)时,shell会将其历史记录写入$ HISTFILE,因此要在另一个终端中获取其历史记录,您可以在终端中键入exit,以及它会写的。

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

答案 3 :(得分:1)

@technosaurus是对的。当bash退出时会写入$ HISTFILE,因此您可以退出一个bash会话,并启动一个新的会话,并且应该通过该文件保留历史记录。

但我认为有更好的方法可以解决您的问题。 bash手册包含history built-in command的说明。它允许您使用history -w [filename]保存此历史记录,并使用history -r [filename]阅读历史记录。如果您不提供文件名,则使用$ HISTFILE。

因此,我建议您将屏幕会话中的历史记录保存到特定文件(如果需要,还可以保存到默认的$ HISTFILE)。然后在要从中访问历史记录的其他bash会话中读取历史记录文件。这样您就不必退出原始的bash会话。

答案 4 :(得分:1)

使用这个: 屏幕-L 有资本L 它会将终端输入和输出的副本存储到名为screenlog.0的文件中 或者如果使用-S命名,日志文件将获取屏幕名称

答案 5 :(得分:1)

我将下一行放入我的.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

我的默认.bashrc的'case'基本上带有'xterm * | rxvt *)'值,所以我只在其中添加了'screen'部分。如果你没有这个“案例”,你可以使用下一个而不是它:

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

我的所有屏幕的所有窗口都有自己的bash_history

注意:这在chroot中不起作用!

答案 6 :(得分:0)

history将显示所有历史记录命令。