Видаліть останні N рядків з історії bash


40

При випадковому вставленні файлу в оболонку він вносить тонну некрасивих дурницьких записів в історію баш. Чи є чистий спосіб видалити ці записи? Очевидно, я міг би закрити оболонку і відредагувати .bash_historyфайл вручну, але, можливо, є якийсь API, який можна змінити історію поточної оболонки?

Відповіді:


36

Ви можете використовувати history -d offsetвбудований файл, щоб видалити певний рядок із поточної історії оболонки або history -cочистити всю історію.

Це не дуже практично, якщо ви хочете видалити діапазон рядків, оскільки він бере лише один зсув як аргумент, але ви можете його зафіксувати у функції з циклом.

rmhist() {
    start=$1
    end=$2
    count=$(( end - start ))
    while [ $count -ge 0 ] ; do
        history -d $start
        ((count--))
    done
}

Телефонуйте за допомогою rmhist first_line_to_delete last_line_to_delete. (Номери рядків відповідно до виходу history.)

(Використовуйте history -wдля примусового запису в файл історії.)


1
Оскільки ОП попросила видалити N останніх рядків, цей сценарій слід змінити, виконавши щось на зразок: tot_lines=$(history | wc -l)і потім повторити history -d $(( tot_lines - $1 )).
ПлазмаBinturong

2
Замість $(history | wc -l)цього є змінна, $HISTCMDяку можна використовувати.
ПлазмаBinturong

29

Саме цей один вкладиш у командному рядку допоможе.

for i in {1..N}; do history -d START_NUM; done

Де START_NUM - початкова позиція входу в історію. N - кількість записів, які ви хочете видалити.

колишній: for i in {1..50}; do history -d 1030; done


3
Цікаво, чому це вже не вбудована функція. "історія" - дуже старий інструмент.
Петро Гладких

дуже добре виконує мету, але цю команду можна побачити в історії :)
Радєєв Акоткар

askubuntu.com/a/978276/22866 є хороший спосіб видалити команду "видалити з історії" з історії :-)
HanSooloo

0

Відповідь користувача2982704 майже працював для мене, але не зовсім. Мені довелося зробити невелику варіацію, як це.

Якщо припустити, що моя історія становить 1000, і я хочу видалити останні 50 записів

start=1000

for i in {1..50}; do count=$((start-i)); history -d $count; done
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.