如果我使用 启动屏幕会话screen -dmS name
,我将如何使用脚本访问该屏幕会话的命令历史记录?
使用↑</kbd>, the last executed command appears, even in screen.
如果我使用 启动屏幕会话screen -dmS name
,我将如何使用脚本访问该屏幕会话的命令历史记录?
使用↑</kbd>, the last executed command appears, even in screen.
我在我的系统上使用默认的 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'
默认屏幕设置意味着您使用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}"
screen
不会保留您键入的命令的历史记录。您的外壳可能会或可能不会保留历史记录。由于您似乎使用bash
,因此您可以使用该history
命令。
screen
确实似乎具有历史搜索的粗略近似值(它仅在回滚缓冲区中搜索命令行。请参阅screen
“历史”命令下的手册页(C-a {
默认绑定)。
@technosaurus 是对的。$HISTFILE 是在 bash 退出时写入的,因此您可以退出一个 bash 会话并启动一个新会话,并且历史应该已经通过该文件保存。
但我认为有更好的方法来解决你的问题。bash 手册包含对history 内置命令的描述。它允许您使用 保存此历史记录history -w [filename]
并使用 读取历史记录history -r [filename]
。如果您不提供文件名,它将使用 $HISTFILE。
因此,我建议您将屏幕会话中的历史记录保存到特定文件(如果需要,也可以保存到默认的 $HISTFILE)。然后在要从中访问历史记录的另一个 bash 会话中读取历史记录文件。这样您就不必退出原始的 bash 会话。
当您exit
使用终端(或外壳)时,外壳会将其历史记录写入 $HISTFILE,因此要在另一个终端中获取其历史记录,您可以输入exit
您想要其历史记录的终端,它将被写入。
cat $HISTFILE
#or tac, less, $EDITOR, ... depending on how you want to "access" it
使用这个: screen -L with capital L 它会将终端输入和输出的副本存储到名为 screenlog.0 的文件中,或者如果您使用 -S 命名它,日志文件将获取屏幕名称
我将下一行放入我的 .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 中不起作用!
history
将显示所有历史命令。