Если я запустил сеанс экрана с screen -dmS name, как мне получить доступ к истории команд этого сеанса экрана с помощью script?
Используя ↑, появляется последняя выполненная команда даже на экране.
Если я запустил сеанс экрана с screen -dmS name, как мне получить доступ к истории команд этого сеанса экрана с помощью script?
Используя ↑, появляется последняя выполненная команда даже на экране.
screen не поддерживает историю команд, которые вы вводите. Ваша оболочка может содержать или не сохранять историю. Поскольку вы используете bash, вы можете использовать команду history.
screen похоже, имеет грубую аппроксимацию поиска в истории (он просто ищет буфер прокрутки для командной строки. См. справочную страницу screen в разделе "история" (привязано к C-a { по умолчанию).
Я использую по умолчанию оболочку 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'
Теперь, когда вы создаете новое окно экрана, он фактически запускает оболочку bash, устанавливая переменную окружения HISTFILE на то, что включает текущий номер окна экрана ($WINDOW).
Файлы истории команд будут совместно использоваться сеансами экрана с одинаковыми номерами окон.
$HISTFILE при выполненииКак обычно, поведение bash, история записывается только в файл $HISTFILE при выходе из окна оболочки/экрана. Однако, если вы хотите, чтобы команды записывались в файлы истории после выполнения команды и, следовательно, были доступны сразу для других сеансов экрана с тем же номером окна, вы могли бы добавить что-то вроде этого в ваш файл ~/.bashrc:
export PROMPT_COMMAND="history -a; history -c; history -r; ${PROMPT_COMMAND}"
Когда вы exit терминал (или оболочка), оболочка записывает свою историю в $HISTFILE, поэтому, чтобы получить свою историю в другом терминале, вы можете ввести exit в терминале, в котором хотите получить историю, и он будет написан.
cat $HISTFILE
#or tac, less, $EDITOR, ... depending on how you want to "access" it
@technosaurus прав. $HISTFILE записывается, когда bash завершается, поэтому вы можете выйти из одного сеанса bash и начать новый, и история должна быть сохранена через файл.
Но я думаю, что есть лучший способ решить вашу проблему. В руководстве bash содержится описание встроенной в историю команды. Это позволяет сохранить эту историю с помощью history -w [filename] и прочитать историю с помощью history -r [filename]. Если вы не укажете имя файла, оно будет использовать $HISTFILE.
Итак, я бы предложил сохранить историю внутри сеанса экрана в конкретном файле (или по умолчанию, если вы хотите использовать HISTFILE по умолчанию). Затем прочитайте файл истории в другом сеансе bash, с которым вы хотите получить доступ к истории. Таким образом, вам не нужно выходить из первоначальной сессии bash.
используйте это: экран -L с капиталом 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
Мой default.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!
history отобразит всю команду истории.