Синхронизировать историю терминала в c shell

Вопрос или проблема

Для работы я подключаюсь удаленно к серверу Linux, который использует c shell вместо bash, через Remote Desktop. В течение сессии (назовем ее сессия 1) я открываю множество вкладок в заданном терминале и ввожу команды во всех из них. Я также иногда открываю дополнительные сеансы (назовем их сеанс 2 и сеанс 3) с множеством вкладок в соответствующих терминалах и ввожу команды во всех из них.

Я заметил, что команда history, когда вызывается в любой вкладке любого терминала в любой сессии, не включает все команды, которые я использовал во всех вкладках и сессиях. Сохраняется только часть команд.

Я бы хотел иметь историю, которая:

  • Запоминает все введенные команды, независимо от того, в какой я вкладке, терминале или сессии
  • Мгновенно доступна из любой из вкладок/терминалов/сессий

Хотя есть отличный пост почти 12-летней давности, где описано, как сделать именно это, он относится к bash, а не к c shell среде. Таким образом, нет .bashrc, но есть .cshrc. Я ищу решение, которое работает в c shell среде.

ОБНОВЛЕНИЕ:

Я попробовал добавить это в начало файла .cshrc:

set history=10000
set savehist=(10000 merge)
alias precmd 'history -L, history -S'

Где set history=10000 устанавливает размер списка истории,

set savehist=(10000 merge) устанавливает количество строк в списке истории для сохранения в .history при выходе из сессии, и merge объединяет историю сеанса с общей историей при выходе,

alias precmd 'history -L; history -S' задает некоторые команды для выполнения перед каждой командой в терминале. Опция -L добавляет файл истории в текущий список истории. Опция -S записывает список истории в файл.

Это не сработало так, как я хотел. Теперь каждый раз, когда я ввожу history в терминале, размер списка команд истории драматически увеличивается. Список команд истории не обновляется во вкладках терминала сеанса.

Я попробовал и это, без улучшений:

set history = 10000
set histdup = erase
set savehist = (${history} merge lock)

alias precmd 'history -S'
alias postcmd 'history -M'

Я не совсем уверен, что значат все строки, но я знаю, что precmd якобы обозначает, что перед выполнением команды нужно сделать это, а postcmd якобы обозначает, что после выполнения команды нужно сделать это. Опция -M объединяет содержимое файла истории с текущим списком истории и сортирует полученный список по метке времени, содержащейся в каждой команде.

Мне кажется, что я близок к решению, возможно, мне не хватает какой-то ключевой строки для добавления в файл .cshrc, или, может, мне нужно изменить порядок.

Действительно, кажется, вы близки. Поскольку я недавно изучал как работает история в csh, я полагаю, следующее должно помочь:

set history = 10000
set histdup = erase
set savehist = (${history} merge)

alias precmd "`alias precmd`; history -S"

Таким образом, перед каждой “командой” вы вызываете history -S, что заставляет механизм сохранения (а значит и слияния) срабатывать, а не ждать до выхода из оболочки, чтобы затем слить (что является обычным поведением для режима “merge”, установленного savehist).

Обратите внимание, что изменения не появятся сразу в других ваших терминалах, вам нужно будет выполнить какую-то команду (или даже просто нажать ВВОД), чтобы прочитать обновленный файл истории в другой сессии(ях).

P.S.: вы заметите, что я слегка изменил строку alias, это просто для добавления к существующему значению precmd, так как в моем случае в нем происходили и другие вещи.

.

Ответ или решение

Для синхронизации истории команд в c shell на удаленном сервере Linux, особенно при использовании нескольких сессий и вкладок, следует настроить конфигурацию таким образом, чтобы каждая команда сохранялась и была доступна во всех текущих сессиях и вкладках. Это поможет вам не терять введённые команды и обеспечит быстрое их восстановление.

Шаги по настройке:

  1. Редактирование файла конфигурации .cshrc.
    Самыми важными этапами будут установка размера истории и настройка параметров команд для автоматического сохранения и слияния исторических данных:

    set history = 10000
    set histdup = erase
    set savehist = (10000 merge)
    • set history = 10000: устанавливает максимальное количество хранимых команд в истории.
    • set histdup = erase: удаляет повторяющиеся команды из истории.
    • set savehist = (10000 merge): сохраняет заданное количество команд в файл и производит слияние при выходе из сессии.
  2. Настройка команд сохранения и обновления истории при выполнении команд:

    alias precmd "`alias precmd`; history -S"
    • alias precmd "alias precmd; history -S": каждый раз перед выполнением команды вызывается history -S, который сохраняет текущую сессию и объединяет её с общей историей, что обычно происходит при выходе из сессии.
  3. Работа в нескольких сессиях:
    Несмотря на указанные шаги, в момент выполнения команд в одной из вкладок, история не обновляется сразу в других вкладках или сессиях до тех пор, пока не выполнится какая-либо команда. Это связано с тем, что изменения в истории становятся видимыми лишь после их активного вызова.

Пояснение

Данная конфигурация обеспечивает автоматическое обновление истории команд, поддерживая их доступность во всех активных сессиях. Этим достигается основная цель — наличие единой и полной истории, доступной со всех терминалов. Это удобство полезно тем, кто одновременно работает в различных сессиях или вкладках, предоставляя возможность легко отслеживать введенные команды.

Оптимизация настроек c shell для синхронизации истории команд является непростой задачей, но следование этим шагам позволит достичь желаемого результата. Убедитесь, что после внесения изменений вы перезапустили сессии для применения обновлений конфигурации.

Абсолютно уникальные, эффективные решения имеют решающее значение в качественном управлении ИТ-инфраструктурой, включая автоматизацию и поддержку удобных функций для пользователей серверов.

Оцените материал
Добавить комментарий

Капча загружается...