Ferramenta para gravar uma sessão bash interativa para shell script

2

Existe uma ferramenta para gravar uma sessão de shell interativa em um script de shell?

Por exemplo, se inserimos em um terminal:

interactive2sh reconfig_foo
vim /etc/foo.cfg
ibar^ESC:q
/etc/init.d/foo restart

então eu gostaria que a ferramenta criasse um script de shell contendo algo como:

echo bar >> /etc/foo.cfg
/etc/init.d/foo restart

Eu posso gravar uma sessão interativa em um script de shell usando o código abaixo. No entanto, eu teria pensado que esta era uma tarefa bastante comum que haveria uma ferramenta existente. Sempre que eu procuro por essa ferramenta, eu só recebo muitas referências a script / scriptreplay que reproduziria a saída, mas não reconfiguraria o serviço" foo ".

#!/bin/bash
#prototype of interactive2sh, a tool for recording a bash session into a shell script 
export OUTPUT_SH_FILE=~/$1.auto.sh
if [ -e $OUTPUT_SH_FILE ]
then
    find $OUTPUT_SH_FILE* -type f -exec echo -e \n---------- '{}' \; -exec cat '{}'  \; 
    echo ^^^^^ script already exists ^^^^^
    exit 1
fi
mkdir $OUTPUT_SH_FILE.in
mkdir $OUTPUT_SH_FILE.out
echo 'SH_FILE='readlink -f "$0"'' >> $OUTPUT_SH_FILE
echo cd 'pwd' >> $OUTPUT_SH_FILE

#Start a new shell, which logs various things needed to replay the commands
bash --rcfile <(
cat << "RCFILE_EOF"
set +x
source "$HOME/.bashrc"
export PROMPT_COMMAND='RETRN_VAL=$?;echo "$(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" ) # [$$] [RETRN_VAL=$?]" >> $OUTPUT_SH_FILE'
vim () {
    for f in "$@"
    do
        fullpath='readlink -f "$f"'
        [ -e $OUTPUT_SH_FILE.in/"$fullpath" ] || cp --parents "$fullpath" $OUTPUT_SH_FILE.in 
    done
    /usr/bin/vim "$@"
    for f in "$@"
    do
        fullpath='readlink -f "$f"'
        test ! -e $fullpath || cmp "$fullpath" $OUTPUT_SH_FILE.in/"$fullpath" || (
            cp --parents "$fullpath" $OUTPUT_SH_FILE.out
            echo mv $fullpath $fullpath.'date -r $fullpath +%F'.bak >> $OUTPUT_SH_FILE
            echo cp '$SH_FILE'.out/$fullpath $fullpath >> $OUTPUT_SH_FILE
        )
    done
}
export PS1='[$OUTPUT_SH_FILE] \w>'
RCFILE_EOF
)

chmod +x $OUTPUT_SH_FILE
    
por gmatht 23.02.2014 / 15:05

3 respostas

4

Eu juntei uma implementação básica que pode ser suficiente para as suas necessidades. É baseado em dois scripts: record e replay .

Aqui está o script registro :

history | tail -1 | awk '{ print 1+$1 }' > /tmp/record

E este é o script replay :

fc -l 'cat /tmp/record' 'history | tail -1 | awk '{ print $1-1 }'' | cut -d\  -f2-

O primeiro salva seu número do histórico atual em / tmp / record. O segundo script mostra todos os comandos que você deu desde que o registro foi chamado.

    
por 23.02.2014 / 22:53
2

Você já tentou script ? Pode ser usado para fazer exatamente isso.

    
por 23.02.2014 / 15:42
0

Não parece haver nenhuma ferramenta existente para gravar sessões interativas em shell scripts. No entanto, eu escrevi um script de shell rápido que parece funcionar bem o suficiente se você estiver usando apenas editores de texto e comandos não iterativos. Está disponível em: link

    
por 12.03.2014 / 10:03