Если я начну сеанс экрана с screen -dmS name
, как мне получить доступ к истории команд этого сеанса экрана со сценарием?Bash: Как получить историю команд в сеансе экрана?
Использование ↑, последняя выполненная команда появляется даже на экране.
Если я начну сеанс экрана с screen -dmS name
, как мне получить доступ к истории команд этого сеанса экрана со сценарием?Bash: Как получить историю команд в сеансе экрана?
Использование ↑, последняя выполненная команда появляется даже на экране.
screen
не поддерживает историю команд, которые вы вводите. Ваша оболочка может содержать или не сохранять историю. Поскольку вы используете bash
, вы можете использовать команду history
.
screen
действительно кажется, есть грубое приближение поиска истории (она просто ищет буфера прокрутки для командной строки см. Страница screen
людей под командой «историй» (связанную с C-a {
по умолчанию).
Когда вы exit
терминал (или оболочка) оболочка пишет свою историю $ HISTFILE, поэтому, чтобы получить свою историю в другом терминале можно ввести exit
в терминале вы хотите историю и будет записано.
cat $HISTFILE
#or tac, less, $EDITOR, ... depending on how you want to "access" it
Разве это написано только на 'exit'? – hexacyanide
AFAIK, до тех пор он хранится в памяти до $ HISTSIZE строк, когда он пишет, он сохраняет файл истории в строки $ HISTFILESIZE max – technosaurus
Я забыл про 'shopt -s histappend', см. Http: //unix.stackexchange.com/questions/6501/why-would-any-not-set-histappend-in-bash – technosaurus
@technosau rus прав. $ HISTFILE записывается при выходе bash, поэтому вы можете выйти из одного сеанса bash и начать новый, и история должна быть сохранена через файл.
Но я думаю, что есть лучший способ решить вашу проблему. Руководство bash содержит описание history built-in command. Он позволяет вам сохранить эту историю с history -w [filename]
и прочитать историю с history -r [filename]
. Если вы не укажете имя файла, оно будет использовать $ HISTFILE.
Таким образом, я бы предложил сохранить историю внутри сеанса экрана в конкретном файле (или если вы хотите использовать HISTFILE по умолчанию). Затем прочитайте файл истории в другом сеансе bash, из которого вы хотите получить доступ к истории. Таким образом, вам не нужно выходить из исходной сессии bash.
Я использую стандартную оболочку bash в своей системе и поэтому не могу работать с другими оболочками.
это то, что у меня есть в моем ~/.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'
Теперь, когда вы создаете новое окно экрана, это на самом деле запускает Баш оболочку, установив переменную окружения HISTFILE
к чему-то, что включает в себя номер текущего окна экрана ($WINDOW
).
Файлы истории команд будут совместно использоваться сеансами экрана с одинаковыми номерами окон.
$HISTFILE
об исполненииКак это нормальное поведение баш, история пишется только в файл $HISTFILE
путем при выходе из окна оболочки/экрана. Тем не менее, если вы хотите, команды должны быть записаны в файлы истории после того, как команда будет выполнена, и, таким образом, доступны сразу на другой экран сессий с тем же номером окна, вы можете добавить что-то вроде этого в файл ~/.bashrc
:
export PROMPT_COMMAND="history -a; history -c; history -r; ${PROMPT_COMMAND}"
Это ближе всего к тому, что я хотел бы, но ... пытаясь найти способ сохранить все это в один файл истории. 'HISTSIZE' и т. Д., Похоже, не вставляются, если вы вставляете их в команду' screen' выше. – beroe
history
покажет всю команду истории.
использование этого: экран -L с заглавной L он будет хранить копию терминала ввода и вывода в файл с именем screenlog.0 или если вы используете -S, чтобы назвать его, файл журнала получает экран имя
Но обратите внимание: это регистрирует выход так же, как и вход. – abalter
Я ставлю следующие строки в моем .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 по умолчанию имеет этот «случай» в основном с «XTerm * | rxvt *)» значение, так что я только добавил свой «экран 'часть в нее. Если у вас нет этого «дело», вы можете использовать следующий вместо этого:
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!
Вы имеете в виду от другого окна в той же сессии (или, возможно, от другой сессии)? Возможно. Это предполагает разбор буфера прокрутки целевого окна. Я не достаточно хорошо знаком с экраном, чтобы узнать, как получить доступ к программному обеспечению. Вы можете попробовать прочитать справочную страницу для получения информации о том, как это сделать. – chepner