История нескольких вкладок в терминале bash

Я решаю эту проблему сам. Сначала просто удалите EMACS. Затем введите

brew install emacs --with-cocoa

для переустановки EMACS. Вам не нужно беспокоиться об удалении каталога ~/.emacs.d.

1
05.04.2017, 02:40
1 ответ

Все мои материалы хранятся в одиночном файле, .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 хэш сам по себе уникален, поэтому я использую его для команд. Значения представляют собой временные метки.

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

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

Через 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
3
27.01.2020, 23:34

Теги

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