bash terminal multi-tab history

1

Eu quero uma solução confiável para manter todos comando em todas as guias do terminal no meu bash história ?

Com timestamps , pedidos , últimos comandos por último e exclusivos .

Enquanto aberto, cada guia tem sua lista própria , para que eu possa usar expansão do histórico com PS1 .

E novas abas tomam como base todos os comandos atuais e passados.

    
por bashianer 04.04.2017 / 21:43

1 resposta

2

Eu tenho todas as minhas coisas em um arquivo single , .bash_aliases , que são originados em .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"

cada guia tem seu arquivo: .bash_history_pts_ {0 ..}
mais a atual .bash_history com material antigo

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
}

Um perl hash é em si exclusivo , então eu o uso para comandos . Os valores são os timestamps .

Deve-se garantir que este init seja executado na reinicialização de todas as guias apenas uma vez .

Eu uso o flock do util-linux . Cria um arquivo vazio, que bloqueia as guias. Com o append (> >), as execuções posteriores não são redefinidas.

Após 10 segundos, tempo mais que suficiente para iniciar, uma nova execução é possível.

### 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
    
por 04.04.2017 / 21:53