Как отменить изменения в истории команд?

"Системное Спасение CD" не только имеет поддержку NTFS, но и инструменты для решения проблем Windows, как инструменты редактора реестра и сброс пароля.

http://www.sysresccd.org/SystemRescueCd_Homepage

11
03.05.2015, 11:55
3 ответа

Пока вы редактировали запись истории, но еще не нажали Enter, чтобы вернуться к исходной записи, несколько раз нажмите Ctrl+_ - команду undo - до тех пор, пока не произойдет никаких дальнейших изменений. Вы возвращаетесь к исходной записи.

9
27.01.2020, 19:58

Педантичное примечание к старой записи: содержимое /etc/network/interfaces расскажет вам, как интерфейсы МОГУТ управляться при загрузке (или после запуска перезапуска сети ). Он не является окончательным. В нем не указывается, каким образом данный интерфейс был назначен в данный момент. Например, учитывая управляемый интерфейс DHCP , я могу легко убить dhclient и использовать ifconfig для статического назначения любого IP, который я хочу, интерфейсу (я могу назначить IP-адрес в управляемом диапазоне HCHP , чтобы вызвать больше путаницы).

Возможно, другой администратор сделал это, чтобы проверить что-то и забыл очистить. Или я могу запустить dhclient eth0 на интерфейсе со статическим назначением теперь DHCP будет управлять интерфейсом. Или другой администратор, возможно, сделал опечатку и теперь avahi динамически настроил интерфейс с локальным адресом канала.

Конечно, эти вещи происходят не каждый день, но это только в условиях разработки или в странных ситуациях, когда я когда-либо спрашивал себя: «Как этот интерфейс был настроен?» При нормальных обстоятельствах я никогда не задаю этот вопрос.

В целом, я считаю, что ответ: «Нет, вы не можете знать наверняка.» Ядро не ведет запись, насколько известно. Лучшее, что вы можете сделать, это grep через обычных подозреваемых в /var/log/. Но если кто-то пришел с назначенным вручную статическим IP-адресом, вам не повезло.

-121--22421-

Параметр --status-fd сообщает dpkg для сообщения о ходе выполнения в путь, который могут анализировать другие программы, например, для представления пользователю хороших отчетов о ходе выполнения в графическом интерфейсе пользователя.

Аргументом для --status-fd является дескриптор файла , т.е. номер, обозначающий открытый файл. Немного упростив ситуацию:

  • Когда процесс открывает файл впервые, этому файлу присваивается номер дескриптора 0. В следующий раз файлу присваивается дескриптор номер 1 и т.д. Системный вызов open возвращает дескриптор файла.
  • Когда процесс хочет выполнить операцию над файлом, например, чтение или запись из него, он обозначает файл своим дескриптором, например, read (0, addr, 10) означает «read 10 bytes from descriptor 0 и помещает их по адресу памяти addr ».
  • Каждый процесс имеет собственные дескрипторы файлов: дескриптор файла n в процессе p не имеет связи с дескриптором файла n в процессе q .
  • При создании процессы наследуют дескрипторы файлов своих родителей.
  • По соглашению процессы выполняются с уже открытыми дескрипторами файлов 0, 1 и 2. 0 используется для ввода, 1 для нормального вывода и 2 для сообщений об ошибках.

Перенаправление открывает файл на определенном дескрипторе. Например,в сценарии оболочки или в командной строке mycommand < somfile соединяет номер дескриптора файла 0 (стандартный ввод), так что somfile (который открыт для чтения) вместо того, что было раньше (терминал, если команда выполняется в терминале). Можно добавить номер дескриптора к оператору перенаправления: mycommand 3 < somefile соединяет номер дескриптора файла 3 с somfile (большинство команд не будут выполнять ничего с этим дескриптором файла).

При установке, обновлении или удалении пакетов dpkg выполняет различные другие команды в сценариях перед/после установки/удаления пакетов. Некоторые из этих команд могут считывать входные или отображаемые сообщения, поэтому dpkg сохраняет стандартные дескрипторы, подключенные к тому, к чему они были подключены при вызове.

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

dpkg --status-fd 3 -i somefile.deb 3>/tmp/dpkg.status

На другом терминале выполните команду tail -n + 1 -f/tmp/dpkg.status и просмотрите приходящие сообщения о состоянии.

Часто внешний интерфейс, вызывающий dpkg и желающий отчетов о состоянии, открывает канал (однонаправленный канал связи) перед запуском dpkg и передает дескриптор файла для записи конца канала в качестве аргумента -status-fd . Затем фронтэнд считывает из считываемого конца канала и получает сообщения о состоянии по мере их создания, не рискуя им смешаться с чем-либо другим.

-121--128736-

Вернитесь к исходной команде , если вы внесли несколько изменений в строку:

revert-line (M-r) 
    Undo all changes made to this line. This is like 
executing the undo command enough times to get back to the beginning.

M - это мета-ключ, который для меня altr .


Безвозмездная, но полезная информация

Когда выполнил команду, подобную ранее выполненной OP (это случается), нечего «отменить», поскольку команды обрабатываются и запоминаются в библиотеке GNU Readline и не записываются в $ HISTFILE до тех пор, пока оболочка не Я говорю об этом потому, что вы не можете просто grep $ HISTFILE , как можно ожидать, и это может быть не идеальным выходом из оболочки.

Вот несколько вариантов, которые избавят вас от прокрутки всех предыдущих команд readline.

Если вы помните некоторые команды , нажмите ctrl + r и введите то, что вы помните, чтобы искать по предыдущим командам , содержащим этот ряд. При повторном нажатии ctrl + r отобразится следующий последний поиск.

Например, введите ls -l , затем ctrl + r столько раз, сколько требуется для поиска предыдущей команды. Если прокрутить мимо него, ctrl + s будут искать вперед из текущей позиции.

Команда fc bash builtin полезна для перечисления номеров индексов вместе с предыдущими командами readline.

fc -l -100 перечислит предыдущие команды 100 в строке readline.

Кроме того, если OP знает, что ищет предыдущую команду ls -l , он может направить вывод в grep , например: fc -l -100 | grep 'ls -l'

Это должно вывести список предыдущих команд ls -l , которым предшествует индексный номер. Выходные данные выглядят следующим образом:
2065 ls -l

Теперь можно использовать обозначение события ! n , где n - номер индекса. В этом примере выполнение ! 2065 расширится до ls -l .


Хотя это не помогает постфактум, все, кто хочет сохранить недавнюю историю команд при изменении предыдущих команд, должны видеть раздел HISTORY EXPANSION в man bash . Вот несколько альтернативных методов изменения старых команд без перезаписи истории.

В разделе Обозначения событий показано, как можно легко редактировать последовательность из последней использованной команды.

^string1^string2^
              Quick  substitution.  Repeat the previous command, replacing string1 with string2.  Equivalent to
              ``!!:s/string1/string2/'' (see Modifiers below).

Пример:

$ echo foo
foo 
$ ^foo^bar
echo bar
bar

Последние команды теперь показывают:

echo foo
echo bar

В приведенном выше примере также объясняется, как использовать sed для замены последовательности в указателе события.

!-n    Refer to the current command minus n.

Если 3 команды в истории имеют значение echo foo , то следует использовать:
! -3: s/foo/bar

Обратите внимание на то, что обозначения событий будут отображаться в истории как выполняемая команда, в данном случае echo bar . Он не будет отображаться в истории как ! -3: s/foo/bar .

Просто выбросить это там, как это кажется тесно связано, даже если это больше «не делать», чем «отменить» решение, которое ищет ОП.

5
27.01.2020, 19:58

Переменная readline revert-all-at-newline, доступная начиная с bash -3.2, дает почти желаемый эффект.

Если установлено, то нажатие ввода в любой строке (может быть другой командой,или даже пустая строка )вернет все записи истории, которые были отредактированы, но не выполнены (, как в примере в вопросе ).

Можно установить с помощью

.
set revert-all-at-newline on

в ~/.inputrc.

или

bind 'set revert-all-at-newline on'

в ~/.bashrc.

2
23.11.2020, 04:22

Теги

Похожие вопросы