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

Zen*_*Zen 22 command-line shell bash io-redirection

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

我是echo 'something' >> tree_hole用来做这项工作的。

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

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

function th { echo "$1" >> /Users/zen1/zen/pythonstudy/tree_hole; }
export -f th
Run Code Online (Sandbox Code Playgroud)

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

有没有?

Cel*_*ada 47

设置 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$ 
Run Code Online (Sandbox Code Playgroud)

  • 这是最终的答案。请注意,如果您使用 `>|` 强制它,您仍然可以覆盖该文件。`zsh` 默认启用此行为。 (3认同)
  • @Zen bash 中的`set +o noclobber` 或`set +C`。 (3认同)
  • 它是 `setopt noclobber` 和 `setopt clobber`。看起来它并不完全是“默认”,它取决于您的发行版附带的配置文件。 (2认同)

Sep*_*our 7

如果您担心>操作员会损坏您的文件,您可以将文件属性更改为仅附加:
ext2/ext3/ext4文件系统中: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
}
Run Code Online (Sandbox Code Playgroud)

  • 2) 您通常应该使用 `-r` 选项调用 `read` 命令,以防止输入中的任何反斜杠转义以下字符。3) 在 bash 脚本中,脚本变量名通常使用小写,因为系统变量都使用大写。因此,如果您对自己的变量使用大写字母,您会混淆阅读您代码的人,并且您可能会不小心破坏了稍后要在脚本中使用的系统变量。如果你 [source](http://en.wikipedia.org/wiki/Source_%28command%29) 脚本,它会破坏后续命令的变量。 (3认同)
  • 4) `echo` 对于打印固定字符串很方便,但它可以对任意数据做意想不到的事情,尤其是在 GNU 系统上。_far_ 使用 `printf` 更安全。有关更多信息,请参阅 http://unix.stackexchange.com/questions/65803/why-is-printf-better-than-echo,尤其是 Stéphane Chazelas 的回答。 (3认同)
  • @PM 2Ring,今天我从你那里学到了很多东西,非常感谢..我会尽快修复它们。 (3认同)
  • 这个脚本有一些问题。1) 您通常应该在参数扩展(以 `$` 开头的内容)周围放置双引号,以防止通配符、分词和相关的空格问题。在线 [ShellCheck](http://www.shellcheck.net) 应用程序可以在 bash 脚本中捕获此问题和其他各种问题。在相关说明中,`"$@"` 比 `$*` _安全得多。 (2认同)