22

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

使用↑</kbd>, the last executed command appears, even in screen.

4

7 回答 7

26

我在我的系统上使用默认的 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 c或创建一个新窗口Ctrl+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/屏幕窗口时才会将历史记录写入$HISTFILE文件。但是,如果您希望在命令执行后将命令写入历史文件,从而立即可用于具有相同窗口编号的其他屏幕会话,您可以在~/.bashrc文件中添加如下内容:

export PROMPT_COMMAND="history -a; history -c; history -r; ${PROMPT_COMMAND}"
于 2014-02-12T02:48:32.410 回答
7

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

screen确实似乎具有历史搜索的粗略近似值(它仅在回滚缓冲区中搜索命令行。请参阅screen“历史”命令下的手册页(C-a {默认绑定)。

于 2013-02-16T20:23:51.103 回答
3

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

但我认为有更好的方法来解决你的问题。bash 手册包含对history 内置命令的描述。它允许您使用 保存此历史记录history -w [filename]并使用 读取历史记录history -r [filename]。如果您不提供文件名,它将使用 $HISTFILE。

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

于 2013-08-08T16:48:10.197 回答
2

当您exit使用终端(或外壳)时,外壳会将其历史记录写入 $HISTFILE,因此要在另一个终端中获取其历史记录,您可以输入exit您想要其历史记录的终端,它将被写入。

cat $HISTFILE
#or tac, less, $EDITOR, ... depending on how you want to "access" it
于 2013-02-16T21:14:20.063 回答
1

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

于 2014-04-08T16:22:21.940 回答
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 中不起作用!

于 2017-03-03T09:47:33.443 回答
0

history将显示所有历史命令。

于 2014-02-12T02:53:45.023 回答