除了“>>”之外,还有另一种简单的方法将行附加到文件末尾吗?

除了“>>”之外,还有另一种简单的方法将行附加到文件末尾吗?

最近我正在将短句子回显到tree_hole文件中。

我曾经echo 'something' >> tree_hole做过这项工作。

但我总是担心如果我输错了,>而不是>>,因为我经常这样做。

所以我在 bashrc 中创建了自己的全局 bash 函数:

function th { echo "$1" >> /Users/zen1/zen/pythonstudy/tree_hole; }
export -f th

但我想知道是否有另一种简单的方法可以将行附加到文件末尾。因为我可能需要在其他场合经常使用它。

有没有?

答案1

设置 shell 的noclobber选项:

bash-3.2$ set -o noclobber
bash-3.2$ echo hello >foo
bash-3.2$ echo hello >foo
bash: foo: cannot overwrite existing file
bash-3.2$ 

答案2

如果您担心您的文件会被>操作员损坏,您可以将文件属性更改为仅附加
外部2/外部3/外部4文件系统:chattr +a file.txt
XFS文件系统:echo chattr +a | xfs_io file.txt

如果你想要一个函数,我已经为自己创建了一个函数(我在服务文件中使用它来记录输出),你可以根据你的目的更改它:

# This function redirect logs to file or terminal or both!
#@ USAGE: log option data
# To the file     -f file
# To the terminal -t
function log(){
        read -r data       # Read data from pipe line

        [[ -z ${indata} ]] && return 1    # Return 1 if data is null

        # Log to /var/log/messages
        logger -i -t SOFTWARE ${data}

        # While loop for traveling on the arguments
        while [[ ! -z "$*" ]]; do
                case "$1" in
                        -t)
                                # Writting data to the terminal
                                printf "%s\n" "${data}"
                                ;;
                        -f) 
                                # Writting (appending) data to given log file address
                                fileadd=$2
                                printf "%s %s\n" "[$(date +"%D %T")] ${data}" >> ${fileadd}
                                ;;
                        *)
                                ;;
                esac
                shift           # Shifting arguments
        done
}

答案3

使用tee使用附加选项:

foo | tee -a some-file
# or
tee -a some-file <<EOF
blah blah
EOF
# or 
tee -a some-file <<<"blah blah"

答案4

我想使用sed(即使使用备份副本 - 请参阅之后的扩展-i):

sed -i.bak '$ a\something' /Users/zen1/zen/pythonstudy/tree_hole

相关内容