使用Bash多次写入文件

我正在创建一个bash脚本来自动执行某些命令,我​​在将错误检查写入同一文件时遇到了一些麻烦.

#!/bin/bash

touch ErrorLog.txt

bro-cut service < conn.log | sort | uniq -c > ProtocolHierarchy.txt
if [ $? -eq 0 ]; then
    echo -e "OK Protocol Hierarchy Created\n" > ErrorLog.txt
else
    echo -e "Failed Creating Protocol Hierarchy\n" > ErrorLog.txt
fi

bro-cut id.orig_h < dns.log | sort | uniq -c > AllIPAddresses.txt

if [ $? -eq 0 ]; then
    echo -e "OK Created all IP Addresses\n" > ErrorLog.txt
else
    echo -e "Failed Creating all IP Addresses\n" > ErrorLog.txt
fi

目标是拥有一个我可以打开的文件,看到所有命令都工作或失败,目前文件看起来像这样

-e OK Created all IP Addresses

当我希望它看起来像这样

OK Protocol Hierarchy Created
OK Created all IP Addresses

我真的很喜欢bash脚本,所以任何提示都将不胜感激!

解决方法

打开一次,并多次写入该文件描述符.

# Open (creating or truncating) the output file (only once!)
exec 3>ErrorLog.txt

# Write a line to that already-open file
echo "something" >&3

# Write a second line to that already-open file
echo "something else" >&3

# Optional: close the output file (can also be implicit when the script exits)
exec 3>&-

一个常见的习惯是使用>>以附加模式打开,但每行执行一次效率要低得多.

# Open ErrorLog.txt,truncating if it exist,write one line,and close it
echo "something" >ErrorLog.txt

# Reopen ErrorLog.txt,write an additional line to the end,and close it again
echo "something else" >>ErrorLog.txt

将此练习用于您的脚本(并进行其他一些最佳实践改进)如下所示:

#!/bin/bash

# not related to file output,but to making sure we detect errors
# only works correctly if run with bash,not sh!
set -o pipefail ## set exit status based on whole pipeline,not just last command

# picking 3,since FD numbers 0-2 are reserved for stdin/stdout/stderr
exec 3>ErrorLog.txt

if bro-cut service <conn.log | sort | uniq -c >ProtocolHierarchy.txt; then
    echo "OK Protocol Hierarchy Created" >&3
else
    echo "Failed Creating Protocol Hierarchy" >&3
fi

if bro-cut id.orig_h <dns.log | sort | uniq -c >AllIPAddresses.txt; then
    echo "OK Created all IP Addresses" >&3
else
    echo "Failed Creating all IP Addresses" >&3
fi

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...