screen -dmS name
启动一个screen会话,如何在脚本中访问该screen会话的命令历史记录?即使在screen中,使用↑键也会显示最后执行的命令。
screen -dmS name
启动一个screen会话,如何在脚本中访问该screen会话的命令历史记录?我使用系统默认的bash shell,所以可能无法与其他shell兼容。
这是我在~/.screenrc
文件中的配置,以便每个新的screen窗口都有自己的命令历史记录:
要打开一组带有各自命令历史记录文件的默认screen窗口,您可以将以下内容添加到~/.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'
export PROMPT_COMMAND="history -a; history -c; history -r; ${PROMPT_COMMAND}"
screen
不会保留您输入的命令历史记录。您的 shell 可能会保留历史记录。由于您使用的是 bash
,因此可以使用 history
命令。
screen
看起来有一个粗略的历史搜索近似值(它只是在滚动缓冲区中搜索命令行)。请参阅 screen
手册中的“history”命令(默认绑定为 C-a {
)。
@technosaurus是正确的。$HISTFILE在bash退出时被写入,因此您可以退出一个bash会话,然后启动一个新的会话,历史记录应该通过文件得以保留。
但我认为有更好的方法来解决您的问题。bash手册包括history内置命令的描述。它允许您使用history -w [filename]
将此历史记录保存,并使用history -r [filename]
读取历史记录。如果您没有提供文件名,它将使用$HISTFILE。
因此,我建议您将历史记录保存在屏幕会话中的特定文件中(或者保存到您的默认$HISTFILE中,如果您愿意)。然后在您想要从中访问历史记录的其他bash会话中读取历史记录文件。这样,您就不必退出原始bash会话。
cat $HISTFILE
#or tac, less, $EDITOR, ... depending on how you want to "access" it
shopt -s histappend
,请参考:http://unix.stackexchange.com/questions/6501/why-would-anyone-not-set-histappend-in-bash - technosauruscase "$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' 部分。如果你没有这个 'case',你可以使用下一个替代它:
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
会显示所有的历史命令。
HISTSIZE
等似乎不会生效。 - beroe