在bash中执行并记录命令

在bash中执行并记录命令,bash,Bash,我正在用各种工具在bash中进行一些数据分析,有时我会输入 >some_command -with -complicated -arguments 通常我会立即跟进 >echo "some_command -with -complicated -arguments" >> mylog.txt 有没有办法一次完成这一切?点击向上箭头、添加echo和引号等都很痛苦 我不想记录我的整个会话,我应该补充说,因为会有很多东西不值得记录 根据Charles Duffy指出的参考资

我正在用各种工具在bash中进行一些数据分析,有时我会输入

>some_command -with -complicated -arguments
通常我会立即跟进

>echo "some_command -with -complicated -arguments" >> mylog.txt
有没有办法一次完成这一切?点击向上箭头、添加
echo
和引号等都很痛苦


我不想记录我的整个会话,我应该补充说,因为会有很多东西不值得记录

根据Charles Duffy指出的参考资料,我最终将其添加到了我的.bashrc中:

verbose () {
  echo "$@" >> mylogfile
  "$@"
}

verbose sleep 1 # "sleep 1" is the example command
logit() {
    fc -ln -1 | sed '1s/^[[:space:]]*//' >> ${1:-commands.txt}
}

因此,
logit
本身将把最后一个命令添加到
commands.txt
,而
logit myfile
将把最后一个命令添加到
myfile

查看
history
命令以及.bash_history文件cross site duplicate:Local very near duplicate(回答另一个会使这个问题的答案显而易见):同样,这将记录
-foo“bar baz”
-foo bar baz
相同。如果您只需要与用户运行的命令语义等价,考虑:
verbose(){local cmd_q;printf-v cmd_q'%q'$@;printf'%s\n'${cmd_q%}>>mylogfile;“$@”}
——但这只是语义等价,不是精确的文本(比如,
verbose cat-“$(某个东西)”>其他地方
不会记录重定向,也不会记录它是
某个东西的输出,该东西在所述重定向之前用于形成最后一个参数)。是的,这是一个问题。例如,
sed-i“s/Alice/Bob/g”test.txt
被记录为
sed-i s/Alice/Bob/g test.txt
。我希望存储准确的原始命令。