如何轻松地将某些特定的命令行命令记录到文件中?

时间:2016-03-19 10:07:00

标签: bash

我经常在Mac OS,Linux甚至Windows上使用单行命令执行配置更改,我想轻松地将它们记录在文件中,因此如果我必须重新配置机器,我可以重播。

请注意,我不想仅为某些命令执行这些操作,因此shell历史记录无法使用。

理想情况下,我希望能够使用某种shell扩展来记录一些命令。

如果您知道如果使用空格启动bash命令,则此命令不会记录到历史记录中。

如果我可以使用另一个相反的前缀怎么办?那里有什么东西可用于此吗? bash的解决方案绰绰有余,如果有一个已经存在的解决方案,它会比我写一个新解决方案好得多。

3 个答案:

答案 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"

这有问题:

    每次打印提示时都会运行
  1. PROMPT_COMMAND。只需多次按 Enter 就可能导致多次记录命令。
  2. 使用两个空格进行标记当然需要您从ignorespace中删除ignorebothHISTCONTROL,以便始终记录以空格开头的命令。
  3. AFAICT,在读取下一个命令时会更新历史记录,因此在下一个命令返回到提示后会记录该命令,因为那时PROMPT_COMMAND中有正确的历史记录。
  4. 所有这些在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命令时,创建日志条目并且命令作为未受干扰的

执行

你可以自动创建这些函数,如果它们的列表就像......所有这些函数