首页 > 解决方案 > 仅在文件存在时附加到文件

问题描述

我已经在 SO 上看到了几个关于如何在文件存在时附加到文件并在不存在时创建新文件 ( echo "hello" >> file.txt) 或在文件存在时覆盖文件并在不存在时创建新文件 () 的答案echo "hello" > file.txt

但是我如何确保echo "hello"只有在文件已经存在时才有效并附加到文件中,如果不存在则引发错误?

编辑:现在,我已经在使用[ -f file.txt ]. 我想知道是否有一种方法可以简单地使用echo.

标签: bash

解决方案


假设文件不存在或者既可读又可写,你可以先尝试打开它进行读取,以确定它是否存在,例如:

command 3<file 3<&- >>file

3<&-在大多数情况下可以省略,因为程序开始从文件描述符读取3而不首先重定向它是出乎意料的。

概念证明:

$ echo hello 3<file 3<&- >>file
bash: file: No such file or directory
$ ls file
ls: cannot access 'file': No such file or directory
$ touch file
$ echo hello 3<file 3<&- >>file
$ cat file
hello
$

这是有效的,因为重定向是从左到右处理的,并且重定向错误会导致命令的执行停止。因此,如果file不存在(或不可读)3<file失败,shell 会打印一条错误消息并停止处理此命令。否则,3<&-关闭与上一步3关联的描述符 ( ) ,重新打开以进行附加并将标准输出重定向到它。file>>filefile


推荐阅读