2015-12-18 1 views
2

Этот цикл будет отображать то, что я хочу сделать, но если я удалю echo от него, он не будет на самом деле ничего удалять:Почему я не могу удалить несколько записей из Баш истории с этого цикла

history | grep ":[0-5][0-9] ls *$" | cut -c1-5 | 
while read id; do 
    echo history -d $id 
done 

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

У меня есть HISTTIMEFORMAT, поэтому grep находит секунды, за которыми следует ls, за которым следует произвольное количество пробелов. По сути, он находит что-нибудь в истории, это всего лишь ls.

Это использование bash 4.3.11 на Ubuntu 14.04.3 LTS

ответ

5

history -d удаляет запись из истории в памяти, и вы используете его в субоболочке индуцированной трубы. Это означает, что вы удаляете запись истории из истории подоболочки, а не историю текущей оболочки.

Используйте замену процесса кормить цикл:

while read id; do 
    history -d "$id" 
done < <(history | grep ":[0-5][0-9] ls *$" | cut -c1-5) 

или, если ваша версия bash достаточно новая, используйте опцию lastpipe, чтобы гарантировать, что Ваш while цикл выполняется в текущей оболочке.

shopt -s lastpipe 
history | grep ":[0-5][0-9] ls *$" | cut -c1-5 | 
while read id; do 
    echo history -d $id 
done 
+0

Хммм, ничто не работает. Хотя ваше объяснение о том, почему это не работает, кажется правдоподобным. –

+0

О, право. Ранняя версия моей командной строки имела обратную сортировку, чтобы справиться с этим, но я не задал ее в своем вопросе. Он отлично работает, когда я это делаю. –

+0

Хорошо :) Я удалил свой предыдущий комментарий, потому что я не был уверен, что достаточно проверил его. – chepner

Смежные вопросы