Intereting Posts

История многостраничных терминалов bash

Я хочу надежное решение для хранения каждой команды на каждой вкладке терминала в моей истории bash ?

С отметками времени , заказами , последними последними и уникальными .

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

И новые вкладки берут за основу все текущие и прошлые команды.

У меня есть все мои вещи в одном файле .bash_aliases , которые получаются в .bashrc :

HISTMY="$HOME/.bash_history" touch $HISTMY HISTSIZE=-1 HISTFILESIZE=-1 HISTCONTROL='ignoredups:ignorespace' HISTTIMEFORMAT="|%d.%m._%a_%T| " HISTMYTERM=${HISTMY}_`tty|sed 's|^/dev/||;s|/|_|g'` PROMPT_COMMAND='history -a $HISTMYTERM' export MYHISTLOCK="/tmp/.my.hist.lock" 

каждая вкладка имеет свой файл: .bash_history_pts_ {0 ..}
плюс текущая .bash_history со старыми вещами

 FBashHist () { local perl_history=$(cat <<'EOF' ######################################## #line 1526 use v5.10; $file = $ARGV[0]; @ARGV = glob "$file*"; $time = "#" . (time - 1_000_000); while (<>) { s/^\s*//; s/\s*$//; next if length() < 4; if (/^#\d{9,}$/) { $time = $_; } else { $cmd = $_; if (exists $hash{$cmd}) { next if $hash{$cmd} ge $time; } $hash{$cmd} = $time; } } @keys = sort { $hash{$a} cmp $hash{$b} } keys %hash; @keys = reverse @keys; @keys = splice(@keys, 0, 8000); # cmds to save @keys = reverse @keys; foreach $key ( @keys ) { push @hist, "$hash{$key}\n$key\n"; } open BA, ">$file" or die "cant open '$file' for write: $!"; print BA @hist; close BA; EOF ) ############################### perl -E "$perl_history" $HISTMY } 

Хеш perl уникален , поэтому я использую его для команд . Значения – это временные метки .

Необходимо убедиться, что этот init запускается при перезагрузке для всех вкладок только один раз .

Я использую flock из util-linux . Он создает пустой файл, который блокирует вкладки. С append (>>) последующие прогоны не сбрасывают его.

Через 10 секунд, более чем достаточно времени для инициализации, возможен повторный запуск.

 ### call with init lock ( flock -x 9 if [ ! -s $MYHISTLOCK ]; then echo $$ >$MYHISTLOCK FBashHist else l=`stat -c %Y $MYHISTLOCK` (( $l )) && d=`date +%s` && ((d -= 10)) if (( $l < $d )); then touch $MYHISTLOCK FBashHist fi fi ) 9>>$MYHISTLOCK sleep 1