记录bash脚本文件

时间:2017-09-28 14:43:21

标签: linux bash shell logging

我有一个非常大的脚本(函数包含大约4000行代码)。以下是其中的一部分:

#!/bin/bash 


. ./functions > /dev/null 2>&1

some_function(){

while true
do

CHOICE=$(whiptail --menu "\n\n\n\n\n\n\n\n" --title "Tools" --nocancel $window 20 \
"1" "Option1" \
"2" "Option2" \
"3" "Option3" 3>&1 1>&2 2>&3)


case $CHOICE in

    1)echo $1 $2 $3;;
    2)echo $2 $1 $3;;                                       
    3)echo $3 $2 $1;;

esac
done
}



while true; do 
arr=()
for ((n=1; n<=$node_num; n++))
        do
        node+=($n NODE$n)
done


OPTION=$(whiptail --menu "\n\n\n\nPlease choose:\n\n\n" --title "tools" $window 20 "${node[@]}" \

case $OPTION in

        1) some_function 1 2 3 ;;  
        2) some_function 2 1 3 ;;
        3) some_function 3 1 2 ;;
esac
done

我想记录脚本中执行的命令。

到目前为止我尝试的是:

  1. #!/bin/bash -x - &gt;这将记录所有输出,但也会&#34;垃圾邮件&#34;日志中包含不需要的信息,如变量值等。但这似乎是迄今为止最好的方式......
  2. 我尝试了#!/bin/bash -i,使用set -o history启用了历史记录。这样做的缺点是它会记录所有内容。例如,当我调用函数文件时,它将记录每一行,就像它被执行一样。
  3. 我尝试过创建日志功能:

    logthis(){
        ## print the command to the logfile
        echo "$(date) $@" >> $historyfile
        ## run the command and redirect it's error output
        ## to the logfile
        eval "$@" 2>> $historyfile
    }
    

    这似乎在大部分时间都有效。但是当我这样做时,例如:

    case $OPTION in
        1) logthis "some_function 1 2 3" ;;  
        2) some_function 2 1 3 ;;
        3) some_function 3 1 2 ;;
    esac
    
  4. 它不会起作用,因为我将丢失论据1 2 3

    您是否还有其他想法在bash脚本中执行优雅的日志记录系统?

2 个答案:

答案 0 :(得分:5)

删除日志功能中的eval。只需编写"$@"即可执行传递的命令。

logthis() {
    echo "$(date): $@" >> "$historyfile"
    "$@" 2>> "$historyfile"
}

然后您可以通过简单地预先logthis来记录命令。无需额外报价。

logthis some_function 1 2 3

这将很好地保留所有参数 - 即使它们有空格或其他特殊字符。

我建议对echo命令稍作改进。如果你使用printf %q,它会更好地记录带有空格的参数。

echo "$(date):$(printf ' %q' "$@")" >> "$historyfile"

答案 1 :(得分:1)

尝试set -v

这不解析像set -x这样的命令,只输出执行的内容。

set -v
: all the things 'in' $0, 'yay!'

完全输出: all the things 'in' $0, 'yay!'
甚至不解析$ 0.

记录的参数,最小的垃圾邮件。 ;)

考虑在主代码块周围包裹curlies以管理输出日志记录。

{ # after setup to parse args, set vars & traps, declare funcs, etc
  your bulk code here
} 2>&1 | tee /some/file.log

您可以为set -x模式保存--verbose垃圾邮件。 ;)