我经常在Mac OS,Linux甚至Windows上使用单行命令执行配置更改,我想轻松地将它们记录在文件中,因此如果我必须重新配置机器,我可以重播。
请注意,我不想仅为某些命令执行这些操作,因此shell历史记录无法使用。
理想情况下,我希望能够使用某种shell扩展来记录一些命令。
如果您知道如果使用空格启动bash命令,则此命令不会记录到历史记录中。
如果我可以使用另一个相反的前缀怎么办?那里有什么东西可用于此吗? bash的解决方案绰绰有余,如果有一个已经存在的解决方案,它会比我写一个新解决方案好得多。
答案 0 :(得分:1)
您可以在PROMPT_COMMAND
中进行日志记录,从shell历史记录中提取特定命令并将其写入文件。
类似的东西:
log () {
last_command="$(history -p \!\!)"
if [[ $last_command == " "* ]] # save commands starting with *two* spaces
then
printf "%s\n" "$last_command" >> ~/special.log
fi
}
PROMPT_COMMAND="log; $PROMPT_COMMAND"
这有问题:
PROMPT_COMMAND
。只需多次按 Enter 就可能导致多次记录命令。ignorespace
中删除ignoreboth
或HISTCONTROL
,以便始终记录以空格开头的命令。PROMPT_COMMAND
中有正确的历史记录。所有这些在zsh中会更容易,preexec
挂钩:
preexec () {
if [[ $1 == " "* ]]
then
printf "%s\n" "$1" >> ~/special.log
fi
}
如果启用了历史记录,preexec
函数会自动将命令作为第一个参数,从而为我们节省了一些麻烦。它在读取命令时运行,但在开始执行之前运行,因此时序非常完美。来自the documentation:
preexec
在读取命令之后执行,即将执行 执行。如果历史机制是活动的(无论是否 该行被从历史缓冲区中丢弃),该字符串即 user typed作为第一个参数传递,否则为空 串。将要执行的实际命令(包括扩展的命令) 别名)以两种不同的形式传递:第二个参数是a 单行,大小限制版本的命令(有类似的东西 功能机构省略);第三个参数包含全文 正在执行。
$ ls
$ echo foo | echo bar
bar
$ cat ~/special.log
ls
echo foo | echo bar
答案 1 :(得分:0)
.bashrc中的函数可以像前缀一样使用:
log_this_command () {
echo "$@" >> ~/a_log_file # log the command to file
"$@" # and run the command itself
}
警告:这只记录扩展的参数,而不是原始输入。
答案 2 :(得分:-1)
function screencapture {echo "used parms: $@"; command screencapture $@}
function screencapture {echo "$(date) screencapture " $@ >> ~/log.txt; command screencapture $@}
当一个运行screencapture
命令时,创建日志条目并且命令作为未受干扰的
你可以自动创建这些函数,如果它们的列表就像......所有这些函数