Вопрос: Инструмент для записи интерактивного сеанса bash в сценарий оболочки


Есть ли инструмент для записи интерактивного сеанса оболочки в сценарий оболочки?

Например, если мы ввели терминал:

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

то я бы хотел, чтобы инструмент создавал сценарий оболочки, содержащий что-то вроде:

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

Я могу записать интерактивный сеанс в сценарий оболочки, используя следующий код. Однако я бы подумал, что это довольно обычная задача, чтобы существовал существующий инструмент. Всякий раз, когда я ищу такой инструмент, я просто получаю много ссылок на script/scriptreplay который воспроизводит выход, но фактически не перенастроит сервис «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

2
2018-02-23 14:05


Источник




Ответы:


Я взломал очень элементарную реализацию, которой может быть достаточно для ваших нужд. Он основан на двух сценариях: запись а также переигровка,

Здесь запись сценарий:

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

И это переигровка сценарий:

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

Первый сохранит ваш текущий номер истории в / tmp / record. Второй скрипт показывает все команды, которые вы указали с момента вызова записи.


4
2018-02-23 21:53



Спасибо, я бы предпочел сохранить, удалась ли команда для неудачных. Эта информация может быть полезна для очистки сценария позже. - gmatht


Ты пробовал script? Его можно использовать для этого.


2
2018-02-23 14:42



Я попробовал скрипт. Какой инструмент вы бы использовали для преобразования машинописного текста в сценарий оболочки, который мог быть выполнен на другом компьютере? - gmatht


Кажется, нет никаких существующих инструментов для записи интерактивных сеансов в сценарии оболочки. Тем не менее, я написал сценарий быстрой оболочки, который, кажется, работает достаточно хорошо, если вы используете только текстовые редакторы и неитеративные команды. Он доступен по адресу: https://github.com/gmatht/joshell/blob/master/interactive2sh


0
2018-03-12 09:03