- Вопрос или проблема
- Проверьте, существует ли хоть какая-то копия zshrc
- Восстановление вручную добавленных путей
- Восстановление определенных параметров
- Ответ или решение
- Шаг 1: Извлечение конфигурации из запущенных сеансов Zsh
- Шаг 2: Поиск резервных копий
- Шаг 3: Восстановление определенных путей
- Шаг 4: Сохранение и сборка новой конфигурации
- Заключение
Вопрос или проблема
Я случайно перезаписал свой файл .zshrc
после неправильно выполненной команды, который содержит несколько сотен строк конфигураций. Тем не менее, у меня осталось 5 терминалов, которые имели открытый zsh до этого инцидента, и, в результате, они остались нетронутыми. Однако, каждый новый шелл, который я открываю, теряет всю конфигурацию zsh, и у меня нет резервной копии.
Я мог бы просто продолжать использовать эти 5 терминалов, но думаю, что есть способ извлечь zshrc из памяти, так как, очевидно, zsh загружает файл в память при запуске и хранит его там, пока не будет завершён. Я попробовал это:
sudo dd if=/dev/mem bs=1M count=256|hexdump -C > ramfile
Но я получил только данные, не относящиеся к моему zshrc.
Буду признателен за любые решения.
Я бы предложил использовать директорию /proc/PID/fd/
, но zsh закрывает файловый дескриптор, указывающий на его конфигурацию, после её разбора. Исходя из этого, мое лучшее предположение — файл в его оригинальном виде потерян.
Тем не менее, есть способы извлечь текущую конфигурацию zsh, которые могут помочь вам восстановить её. Ответ на этот другой вопрос приходит на ум:
Все привязки клавиш:
for m ($keymaps) bindkey -LM $m
Все пользовательские виджеты ZLE
zle -lL
Все zstyle:
zstyle -L
Загруженные модули:
zmodload -L
Все переменные:
typeset -p +H -m '*'
С загруженным модулем
zsh/parameters
это также будет включать
псевдонимы, опции, функции…
Самостоятельный ответ
Несколько других вещей, которые я нашёл, восстанавливая свой перезаписанный zsh:
Проверьте, существует ли хоть какая-то копия zshrc
Это не произошло в моем случае, но если случайно где-то есть версия .zshrc
(особенно если ваш редактор кода сохраняет файлы в определенное место), существует небольшая вероятность, что она всё ещё существует где-то. Чтобы найти её, выполните следующее:
sudo find . -name ".zshrc"
Проверьте в этих конкретных местах:
- Для пользователей Vim/Vi (в зависимости от конфигурации – это может включать
/var/tmp
,~/.vim/sessions
или~/.local/share/nvim/swap
) - Для пользователей Atom –
~/.atom/recovery
- Для пользователей Emacs – по умолчанию у вас может быть файл с названием
~/.zshrc~
- Общее –
/tmp
Восстановление вручную добавленных путей
Этот скрипт выводит все каталоги, добавленные в $PATH
:
import subprocess
paths = subprocess.check_output("echo $PATH", shell=True, text=True)
list = paths.split(":")
for item in list:
print("export PATH=" + item + ":$PATH")
Восстановление определенных параметров
Используйте set
для перечисления всех параметров, затем grep
по тем, которые вам нужны, таким как:
дефолтный редактор (EDITOR
) и пейджер (PAGER
)
У меня была такая же проблема. К счастью, файл ~/.zshrc.backup содержал предыдущие содержимое моего файла .zshrc. Я скопировал его содержимое, чтобы восстановить. Я предлагаю проверить ~/.zshrc.backup, если вы не закрывали вкладку с предыдущим zshrc. (macOS)
У меня была такая же проблема, и я мог вспомнить точную строку в файле. Я использовал следующее, чтобы найти содержимое и восстановить его:
grep -i -a -B100 -A100 'текст в удалённом файле' /dev/sda1
Я оказался в аналогичной ситуации сегодня вечером, но смог довольно быстро вернуть всё. Моё решение не было самым изящным – сделать общий поиск для любых файлов или папок с zsh
в названии
ls -al ~/.zsh*
Моя команда ls
настроена так, чтобы отображать результаты в порядке последнего изменения ресурса, так что я увидел .zsh.backup
среди первых 3-4 записей. И вдруг груз свалился с плеч….
Если бы мне не повезло, я бы просеивал результаты своего поиска с помощью finder…
# finder
open ~/.zsh* -R
А если бы это не сработало, я бы надел перчатки и перенёс свои усилия по поиску в vscode.
# vscode
code ~/.zsh*
Удачи! 🙂
Ответ или решение
К сожалению, восстановить перезаписанный файл .zshrc
напрямую может быть затруднительно. Однако у вас есть возможность извлечь текущие параметры конфигурации Zsh из активных сеансов оболочки, которые все еще запущены. Ниже представлены шаги, которые помогут вам собрать необходимую информацию для воссоздания вашего .zshrc
.
Шаг 1: Извлечение конфигурации из запущенных сеансов Zsh
-
Переменные окружения:
Чтобы извлечь все переменные, установленные в вашей текущей среде Zsh, используйте следующую команду:typeset -p +H -m '*'
Это покажет все переменные, включая алиасы, опции и функции.
-
Настройки привязки клавиш:
Извлеките настройки привязки клавиш с помощью этой команды:for m ($keymaps) bindkey -LM $m
-
Пользовательские виджеты ZLE:
Чтобы получить список пользовательских виджетов, используйте:zle -lL
-
Стили Zsh:
Если вы использовалиzstyle
для кастомизации, выяснить их можно с помощью:zstyle -L
-
Загруженные модули:
Для получения списка всех загруженных модулей воспользуйтесь:zmodload -L
Шаг 2: Поиск резервных копий
Есть небольшой шанс, что автоматические системы резервного копирования или редакторы кода сохранили ваши данные. Проверьте, есть ли какие-либо копии файла .zshrc
:
sudo find ~ -name ".zshrc*"
Обратите внимание на следующие директории:
- Для пользователей
Vim
: возможно, ваши изменения были сохранены в/var/tmp
,~/.vim/sessions
, или~/.local/share/nvim/swap
. - Для пользователей
Atom
: ищите в~/.atom/recovery
. - Для
Emacs
: файл с именем~/.zshrc~
может предлагать резервную копию. - Не забывайте проверять временные файлы в
/tmp
.
Шаг 3: Восстановление определенных путей
Если вы добавляли специфические директории к переменной PATH
, вы можете извлечь их с помощью следующего Python-скрипта:
import subprocess
paths = subprocess.check_output("echo $PATH", shell=True, text=True)
for item in paths.split(":"):
print("export PATH=" + item + ":$PATH")
Шаг 4: Сохранение и сборка новой конфигурации
Соберите всю извлеченную информацию и создайте новый файл .zshrc
. Это будет вашим новым файлом конфигурации. После этого не забудьте перезапустить Zsh или выполните source ~/.zshrc
, чтобы применить изменения.
Заключение
Хотя восстановить перезаписанный .zshrc
напрямую не получится, вы сможете извлечь множество полезных конфигурационных параметров из активных сеансов. Важно всегда делать резервные копии критически важной конфигурации. Рассмотрите возможность использования систем контроля версий, таких как Git, для сохранения ваших настроек в будущем.