Salva a saída de cada comando para separar arquivos de log?

2

Eu gostaria de tee de saída de cada comando executado interativamente em uma série de arquivos de log separados, um para cada comando. Para fazer isso, escrevi o seguinte script que será configurado como a última coisa a ser executada na inicialização do shell (o final de .bashrc ):

date=$(date +%Y-%m-%d_%H-%M-%S)
randstr=$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'a-f0-9' | head -c 4)
dir=~/log/"${date}_${randstr}"
mkdir "$dir"
i=0
while :
do
    read -e -p "user@host:$(pwd)\$ " cmd
    eval "$cmd 2>&1 | tee \"${dir}/${i}-${cmd}\"" 
    (( i++ ))
done

No entanto, existem alguns problemas com isso. Primeiro de tudo, isso irá parar de ler assim que uma nova linha for encontrada, simplesmente porque é assim que read funciona. Eu não quero esse comportamento. Eu quero que ele se comporte exatamente como um shell, de modo que, por exemplo, quando eu escrevo ls && e pressione Return , ele irá esperar por mais entrada antes de executar qualquer coisa.

Como posso conseguir isso? É possível / viável conseguir isso com scripts de shell? Devo usar uma linguagem de programação mais convencional? Será que devo remendar bash para conseguir isso?

    
por Utku 11.03.2017 / 09:16

1 resposta

0

# teeshell

date=$(date +%Y-%m-%d_%H-%M-%S)
randstr=$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'a-f0-9' | head -c 4)
dir="$(echo ~/log/"${date}_${randstr}")"
mkdir "$dir"
# Redirect everything to tee and perl
exec 1> >(tee /dev/tty |
          perl -pe '                                                                          
            sub reopen {
              open(OUT,">'$dir'/".++$i);
              select OUT;
              $| = 1;
            }                     
            BEGIN {
              'echo $$ > "'$dir'"/pid';
              reopen();                                       
              $SIG{HUP} = \&reopen;                                                           
            }') 2>&1

# wait for perl to save the pid
while [ ! -f "$dir"/pid ] ; do
    true
done

# Magic! Make perl save to a new file with a kill -HUP
PS1="[\$(kill -HUP 'cat "$dir"/pid')][\u@\h:\w]\$ "

Executar:

. teeshell
    
por 11.03.2017 / 22:13