是否有一个工具可以将交互式 shell 会话记录到 shell 脚本中?
例如如果我们在终端输入:
interactive2sh reconfig_foo
vim /etc/foo.cfg
ibar^ESC:q
/etc/init.d/foo restart
然后我希望该工具创建一个包含类似以下内容的 shell 脚本:
echo bar >> /etc/foo.cfg
/etc/init.d/foo restart
我可以使用下面的代码将交互式会话录制到 shell 脚本中。但是,我本以为这是一个很常见的任务,应该有一个现有的工具。每当我搜索这样的工具时,我都会得到很多关于 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
答案1
我编写了一个非常基本的实现,可能足以满足您的需求。它基于两个脚本:记录和重播。
这里是记录脚本:
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 中。第二个脚本显示自调用 record 以来您执行的所有命令。
答案2
你有没有尝试过script
? 它可以用来做这件事。
答案3
似乎没有任何现有的工具可以将交互式会话记录到 shell 脚本中。但是,我编写了一个快速 shell 脚本,如果您只使用文本编辑器和非迭代命令,该脚本似乎可以很好地工作。它可在以下位置获得:https://github.com/gmatht/joshell/blob/master/interactive2sh