Если я запустил сеанс экрана с 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
отобразит всю команду истории.