如果我使用screen -dmS name
开始屏幕会话,我将如何使用脚本访问该屏幕会话的命令历史记录?
使用↑,即使在屏幕上也会显示上次执行的命令。
答案 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'
默认屏幕设置表示您使用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 / 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
将显示所有历史记录命令。