Как получить историю команд в сеансе экрана, используя Bash? - программирование
Подтвердить что ты не робот

Как получить историю команд в сеансе экрана, используя Bash?

Если я запустил сеанс экрана с screen -dmS name, как мне получить доступ к истории команд этого сеанса экрана с помощью script?

Используя , появляется последняя выполненная команда даже на экране.

4b9b3361

Ответ 1

screen не поддерживает историю команд, которые вы вводите. Ваша оболочка может содержать или не сохранять историю. Поскольку вы используете bash, вы можете использовать команду history.

screen похоже, имеет грубую аппроксимацию поиска в истории (он просто ищет буфер прокрутки для командной строки. См. справочную страницу screen в разделе "история" (привязано к C-a { по умолчанию).

Ответ 2

Я использую по умолчанию оболочку 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'

Обеспечить, чтобы новые Windows получили свою собственную историю команд

Настройки экрана по умолчанию означают, что вы создаете новое окно с помощью 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}"

Ответ 3

Когда вы exit терминал (или оболочка), оболочка записывает свою историю в $HISTFILE, поэтому, чтобы получить свою историю в другом терминале, вы можете ввести exit в терминале, в котором хотите получить историю, и он будет написан.

cat $HISTFILE
#or tac, less, $EDITOR, ... depending on how you want to "access" it

Ответ 4

@technosaurus прав. $HISTFILE записывается, когда bash завершается, поэтому вы можете выйти из одного сеанса bash и начать новый, и история должна быть сохранена через файл.

Но я думаю, что есть лучший способ решить вашу проблему. В руководстве bash содержится описание встроенной в историю команды. Это позволяет сохранить эту историю с помощью history -w [filename] и прочитать историю с помощью history -r [filename]. Если вы не укажете имя файла, оно будет использовать $HISTFILE.

Итак, я бы предложил сохранить историю внутри сеанса экрана в конкретном файле (или по умолчанию, если вы хотите использовать HISTFILE по умолчанию). Затем прочитайте файл истории в другом сеансе bash, с которым вы хотите получить доступ к истории. Таким образом, вам не нужно выходить из первоначальной сессии bash.

Ответ 5

используйте это: экран -L с капиталом L он сохранит копию ввода и вывода терминала в файл с именем screenlog.0 или если вы используете -S для его имени, файл журнала получает имя экрана

Ответ 6

Я ввел следующие строки в мой .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!

Ответ 7

history отобразит всю команду истории.